Welcome to Yumao′s Blog.
Java SE Day03
====================
基本類型的序列化 writeInt() readInt()
照片的序列化 ImageIO.read() ImageIO.write()
1 字符串的序列化 編碼問題
println()
readLine()
2 對象的序列化
readObject()
writeObject()
常見文本文件讀取方式
對象的序列化
流的總結
廣義上: 數據轉換為byte 序列 都是序列化
int long 可以序列化 -> 拆分
String 可以序列化 –> 編碼
Image 可以序列化(.png) -> 圖片的壓縮格式
對象(屬性)可以序列化 對象編碼為 byte 序列
7 什麼是對象的序列化: 將Object轉換為byte序列,就是序列化,反之叫反序列化
為什麼要序列化: 為了在byte流中存儲對象
如何序列化: 使用writeObject(Object)/readObject()
1) 序列化流, 是過濾流
ObjectOutputStream writeObject(Object) 序列化對象
ObjectInputStream readObject() 對象的反序列化
2) 序列化接口: 對象必須實現"序列化接口"才能進行 "序列化"
否則出現不能序列化的異常!
3) JavaBean 規範, 必須實現Serializable接口
Java API中的類大多是Java Bean, 基本都實現了Serializable
序列化的應用:
8 淺層複製與深層複製
1) Java的默認複製規則是淺層複製, 性能好, 隔離性差
淺層複製現象, 只複製第一層對象
2) 利用序列化實現深層複製
.Java IO 總結
1)是一種數據操作模型: 把任何數據都作為Byte的有序集合看待
逐一處理的方式方式叫做流.
Java 流模型, 是byte by byte 是數據集合
data : 41 42 00 00 ff ff d6 d0
index : 0 1 2 3 4 5 6 7 8
pointer: ^
RandomAccessFile 只能操作文件, 只能處理基本類型
節點流: 流開始和結束的地方
過濾器: 基本流的功能擴展
字節流: 每次處理一個byte
字符流: 每次出來一個char
ObjectInputStream in = new ObjectInputStream(
new CipherInputStream(
new FileInputStream(file)));
Object obj = in.readObject();
CipherInputStream in = new CipherInputStream(
new FileInputStream(file));
img = ImageIO.read(in);
裝飾器模式: 流的API是按照裝飾器模式設計的
InputStream 最基本的輸入流操作模型, 是抽象類(read()是沒有實現的)
|-- FileInputStream 實現了在文件上讀取的方法 read(), 節點流
|-- ByteArrayInputStream 實現了在數組裡讀取的方法 read()
|-- FilterInputStream 過濾流,包裝在一個基本流外部,提供功能擴展
| |-- DataInputStream 為基本流擴展了基本數據類型讀取
| | readInt() readDouble()...方法的底層是read()
| |-- BufferedInputStream 為基本流提供緩衝處理
| |-- CipherInputStream 解密輸入流, 知道就行
| |-- ZipInputStream 解壓輸入流, 知道就行
|-- ObjectInputStream 對象輸入流, 也是過濾器
OutputStream 最基本的輸出流操作模型,是抽象類(write()是沒有實現的)
|-- FileOutputStream 實現了在文件上寫出的方法 write(), 節點流
|-- ByteArrayOutputStream 在變長數組上實現了write() 方法
|-- FilterOutputStream
| |-- DataOutputStream 基本類型輸出
| |
| |-- BufferedOutputStream 緩衝輸出
| |-- CipherOutputStream 加密輸出
| |-- ZipOutputStream 壓縮輸出
|-- ObjectOutputStream 對象輸出流
字符流, 每次處理一個字符
Reader 抽象類, 定義了抽象方法read(), 每次讀取一個字符
|-- InputStreamReader 也是過濾器, 將byte序列解碼為char序列
| 底層也是依賴基本的byte輸入流
|-- BufferedReader (Scanner) 是字符流過濾器,
| 有常用的文本讀取方法readLine()
|-- FileReader 底層是 FileInputSream + InputStreamReader
| 不能指定讀取文件的字符編碼
Writer 抽象類, 定義抽象方法write() 每次寫出一個字符
|-- OutputStreamWriter 也是過濾器, 將char序列編碼為byte序列
| 底層也是依賴基本的byte輸出流
|-- PrintWriter 是過濾器, 提供了常用方法println()
| 非常常見的文本處理方法
|-- FileWriter = OutputStreamWriter + FileOutputStream
| 不能指定文本輸出編碼, 不好用!
11 Java 多線程編程
1) 程序: 指令+數據的byte序列, 如: qq.exe
2) 進程: 正在運行的程序, 是程序動態的執行過程(運行於主存儲器)
3) 線程: 在進程內部, 並發運程的過程(方法)
4) 並發: 進程是並發運行的, OS將時間劃分為很多時間片段, 儘可能
均勻分配給正在運行的程序, 微觀上進程走走停停, 宏觀上都在運行
這種都運行的現象叫: 並發, 但是不是絕對意義上的"同時"
12 Java 創建一個線程
1)Thread 類: 線程包含一個可以運行的過程(方法)
Thread 類中包含方法 run
2) 創建一個具體線程, 需要繼承於Thread類
3) 覆蓋run 方法(就是更新運行過程), 實現用戶自己的過程
4) 創建線程實例(一個線程)
5) 使用線程實例的start() 方法啟動線程, 啟動以後線程會儘快的
去並發執行run()
13 線程的狀態
1 new 新建
2 Runnable 可以運行(就緒)
3 Running 運行(正在運行)
4 Block 阻塞 掛起
5 Dead 死亡
14 線程狀態管理:
1)讓出CPU
Thread.yield() 當前線程讓出處理器(離開Running),
使當前線程進入Runnable等待
2)休眠
Thread.sleep(times) 使當前線程從 Running 放棄處理器
進入Block狀態, 休眠times毫秒, 再返回到Runnable
如果其他線程打斷當前線程的Block(sleep), 就會發生
InterruptedException.
15 線程的常用屬性
1)線程的優先級 (資源緊張時候, 儘可能優先)
t3.setPriority(Thread.MAX_PRIORITY);
默認有10 優先級, 優先級高的線程獲得執行的機會多. 機會
的多少不能通過代碼干預.
默認的優先級是 5
2)後台線程(守護線程, 精靈線程)
t1.setDaemon(true);
Java進程的結束: 當前所有前台線程都結束時, Java進程結束
後台線程, 不管是否結束, 都被停掉! 因為並發的現象, 後台線程
不會立即結束!
3) 線程名字
getName()
4) 當前線程
Thread main = Thread.currentThread();
16 兩種方式創建線程
1)繼承Thread類
a 繼承Thread類, 覆蓋run()方法, 提供並發運程的過程
b 創建這個類的實例
c 使用start() 方法啟動線程
2)實現Runnable接口
a 實現Runnable接口, 實現run()方法, 提供並發運程的過程
b 創建這個類的實例, 用這個實例作為Thread構造器參數
創建Thread類.
c 使用start() 方法啟動線程
class Foo implements Runnable{
public void run(){
//....
}
}
Thread t = new Thread(new Foo());
t.start();
3)使用 內部類/匿名類 創建線程
17 Sleep 的打斷喚醒
1) Thread.sleep(times) 使當前線程從 Running 放棄處理器
進入Block狀態, 休眠times毫秒, 再返回到Runnable
2)一個線程可以提前喚醒另外一個sleep Block的線程
interrupt() 打斷/中斷
3) 被喚醒線程出現 中斷異常
13) 異步, 同步
1) 異步: 並發, 各干自己的: 如: 一群人上卡車
2) 同步: 步調一致的處理, 如: 一群人上公交車, "倫敦制"
14) 案例異步寫文件
1) 一個線程負責將控制台信息讀取到內存緩衝區(集合)
如果控制台輸入quit 將結束輸入. 中斷寫出線程
2) 一個線程負責將緩衝區中的信息寫到硬盤文件
每次檢查緩衝區是否有數據, 如果有就寫出, 直到空為止
如果沒有數據就休眠5秒
寫出線程是後台線程, 可以自動結束
3) 緩衝區採用隊列(FIFO)的工作方式
1 兩種方式創建線程
1)繼承Thread類
a 繼承Thread類, 覆蓋run()方法, 提供並發運程的過程
b 創建這個類的實例
c 使用start() 方法啟動線程
2)實現Runnable接口
a 實現Runnable接口, 實現run()方法, 提供並發運程的過程
b 創建這個類的實例, 用這個實例作為Thread構造器參數
創建Thread類.
c 使用start() 方法啟動線程
class Foo implements Runnable{
public void run(){
//....
}
}
Thread t = new Thread(new Foo());
t.start();
3)使用 內部類/匿名類 創建線程