輸入流體系
InputStream(抽象基類)
read():單位元組讀取,回傳 int(-1 表結束)
read(byte[])、read(byte[], off, len):批次讀取
skip(long):跳過位元組
available():可讀位元組數
close():關閉釋放資源
主要子類別
| 類別 | 用途 |
| ByteArrayInputStream | 從位元組陣列讀取 |
| FileInputStream | 從檔案讀取,含 getFD() 取得 FileDescriptor |
| FilterInputStream | 裝飾者基類,支援巢狀包裝 |
| BufferedInputStream | 緩衝讀取,提升效能,支援 mark/reset |
| DataInputStream | 讀取基本型別(readInt、readUTF 等),實作 DataInput |
| LineNumberInputStream | 追蹤行號 |
| PushbackInputStream | 可將讀取的位元組推回 (unread()) |
| PipedInputStream | 執行緒間管道通訊(配合 PipedOutputStream) |
| SequenceInputStream | 串聯多個輸入流 |
輸出流體系
OutputStream(抽象基類)
write(int)、write(byte[])、write(byte[], off, len)
flush()、close()
主要子類別
| 類別 | 用途 |
| ByteArrayOutputStream | 寫入記憶體陣列,toByteArray()、toString() |
| FileOutputStream | 寫入檔案,支援 append 模式 |
| BufferedOutputStream | 緩衝寫入,需手動 flush |
| DataOutputStream | 寫入基本型別,實作 DataOutput |
| PrintStream | 含 println(),自動處理換行與編碼 |
| PipedOutputStream | 配合 PipedInputStream 實現執行緒管道 |
物件序列化
// 序列化寫出
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("tmp"))) {
oos.writeObject("Today");
oos.writeObject(new Date());
}
// 反序列化讀回
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("tmp"))) {
String s = (String) ois.readObject();
Date d = (Date) ois.readObject();
}
transient 欄位不會被序列化;static 欄位也不屬於物件狀態。
管道通訊範例
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
// 執行緒 A 寫 out,執行緒 B 讀 in
最佳實務
- 善用
try-with-resources 自動關閉流
- 大量讀寫務必使用
Buffered 包裝
- 文字處理優先用
Reader/Writer 字元流
- 序列化類別宣告
serialVersionUID