Java IO 採用裝飾者模式,以四大抽象類為核心:
InputStream / OutputStream:位元組流(單位:byte),處理二進位資料(圖片、聲音、序列化物件)。Reader / Writer:字元流(單位:char,2 位元組),處理 Unicode 文字,自動處理編碼轉換。關鍵方法:
InputStream.read():讀取單一位元組,回傳 int(-1 表結束)。OutputStream.write(int b):寫入單一位元組。Reader.read() / Writer.write(int c):對應字元版本。close():釋放資源,輸出流會自動 flush()。flush():強制清空緩衝區。| 類型 | 位元組流 | 字元流 | 典型資料源 |
|---|---|---|---|
| 檔案 | FileInputStream / FileOutputStream | FileReader / FileWriter | 本地檔案 |
| 記憶體 | ByteArrayInputStream / ByteArrayOutputStream | CharArrayReader / CharArrayWriter | 位元組/字元陣列 |
| 管道 | PipedInputStream / PipedOutputStream | PipedReader / PipedWriter | 執行緒間通訊 |
| 網路 | Socket.getInputStream() / getOutputStream() | - | 網路連線 |
BufferedInputStream / BufferedReader — 提升讀寫效率,支援 readLine()。DataInputStream / DataOutputStream — 以二進位讀寫基本型別(readInt()、writeDouble() 等)。ObjectInputStream / ObjectOutputStream — 讀寫實作 Serializable 的物件。InputStreamReader / OutputStreamWriter — 位元組流轉字元流的橋樑,指定編碼(UTF-8、GBK 等)。PrintStream / PrintWriter — 格式化輸出,不拋 IOException。GZIPInputStream / ZipInputStream 等。需求:從檔案讀取數值,並加入緩衝。
// 1. 節點流
FileInputStream fis = new FileInputStream("data.dat");
// 2. 包裝資料流
DataInputStream dis = new DataInputStream(fis);
// 3. 再包裝緩衝流
BufferedInputStream bis = new BufferedInputStream(dis);
// 使用
double d = dis.readDouble();
每一層持有下一層的參考,read() 呼叫鏈向下傳遞,職責單一、靈活組合。
serialVersionUID 與版本相容。InterruptedIOException 支援中斷。