Java I/O 採用「裝飾者模式」設計,核心抽象為四大抽象類:
所有具體實現類均繼承自上述抽象類,通過組合實現功能疊加(如 BufferedReader 包裝 FileReader)。
java.io.File 不屬於流,但負責文件/目錄元數據操作:創建、刪除、重命名、屬性判斷、列表獲取等。
File file = new File("data/test.txt");
file.getParentFile().mkdirs(); // 確保父目錄存在
file.createNewFile(); // 創建文件
| 類別 | 用途 | 典型場景 |
|---|---|---|
| FileInputStream / FileOutputStream | 文件字節讀寫 | 圖片、二進制文件複製 |
| ByteArrayInputStream / ByteArrayOutputStream | 內存字節數組流 | 內存中數據暫存、轉換 |
| DataInputStream / DataOutputStream | 基本類型讀寫 | 跨平台數據交換、網絡協議 |
| ObjectInputStream / ObjectOutputStream | 對象序列化/反序列化 | RPC、緩存持久化 |
| BufferedInputStream / BufferedOutputStream | 緩衝字節流 | 大文件讀寫性能優化 |
| 類別 | 用途 | 典型場景 |
|---|---|---|
| FileReader / FileWriter | 文件字符讀寫 | 文本文件處理(默認平台編碼) |
| InputStreamReader / OutputStreamWriter | 字節轉字符橋樑 | 指定編碼(UTF-8/GBK)讀寫 |
| BufferedReader / BufferedWriter | 緩衝字符流 | 按行讀取、高效寫入文本 |
| PrintWriter | 格式化輸出 | 日誌、報表生成 |
唯一同時實現 DataInput、DataOutput 介面的類,支援「隨機讀寫」(移動指針 seek()),適合斷點續傳、大文件修改特定位置。
try (RandomAccessFile raf = new RandomAccessFile("data.db", "rw")) {
raf.seek(100); // 跳到第 100 字節
raf.writeInt(2024); // 寫入 int
raf.seek(0);
System.out.println(raf.readInt());
}
char[] cb 緩衝區(默認 8192 字符)。write() 先寫入緩衝區,滿則 flushBuffer() 一次性刷入底層流。newLine() 寫入系統行分隔符(System.getProperty("line.separator"))。close() 先 flushBuffer() 再關閉底層流。同理 BufferedReader 通過 fill() 批量從底層讀入緩衝區,readLine() 掃描 \n/\r 實現按行讀取。
new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8) 避免亂碼。Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING) (NIO.2) 或緩衝流分塊複製。Serializable 類必須顯式聲明 serialVersionUID。Java I/O 體系雖龐大,但脈絡清晰:「字節流處理二進制,字符流處理文本,緩衝流提升效能,轉換流橋接編碼」。理解裝飾者模式下的組合關係,按場景選擇合適組合,即可應對 90% 業務場景。