Java IO 類層次結構全景圖(基於繼承關係)
java.lang.Object
├── InputStream (字節輸入流抽象基類)
│ ├── FileInputStream (文件字節輸入)
│ ├── PipedInputStream (管道字節輸入)
│ ├── FilterInputStream (過濾字節輸入裝飾基類)
│ │ ├── BufferedInputStream (緩沖字節輸入)
│ │ ├── LineNumberInputStream (行號字節輸入)
│ │ ├── PushbackInputStream (推回字節輸入)
│ │ └── DataInputStream (數據類型字節輸入)
│ └── SequenceInputStream (序列字節輸入)
│
├── OutputStream (字節輸出流抽象基類)
│ ├── FileOutputStream (文件字節輸出)
│ ├── PipedOutputStream (管道字節輸出)
│ ├── FilterOutputStream (過濾字節輸出裝飾基類)
│ │ ├── BufferedOutputStream (緩沖字節輸出)
│ │ ├── DataOutputStream (數據類型字節輸出)
│ │ └── PrintStream (格式化打印輸出)
│
├── Reader (字符輸入流抽象基類)
│ ├── PipedReader (管道字符輸入)
│ ├── BufferedReader (緩沖字符輸入)
│ ├── LineNumberReader (行號字符輸入)
│ ├── FilterReader (過濾字符輸入)
│ ├── InputStreamReader (字節→字符轉換橋樑)
│ │ └── FileReader (文件字符輸入)
│ └── StringReader (字符串字符輸入)
│
├── Writer (字符輸出流抽象基類)
│ ├── PipedWriter (管道字符輸出)
│ ├── BufferedWriter (緩沖字符輸出)
│ ├── FilterWriter (過濾字符輸出)
│ ├── OutputStreamWriter (字符→字節轉換橋樑)
│ │ └── FileWriter (文件字符輸出)
│ └── StringWriter (字符串字符輸出)
│
├── File (文件/目錄路徑抽象,非流)
└── RandomAccessFile (隨機訪問文件,獨立體系,實現 DataInput/DataOutput)
核心設計模式識別
| 模式 | 體現類 | 說明 |
| 裝飾者模式 | FilterInputStream/OutputStream、FilterReader/Writer | 動態添加緩沖、轉換、計數等功能 |
| 適配器模式 | InputStreamReader/OutputStreamWriter | 字節流↔字符流轉換,編碼處理 |
| 模板方法 | InputStream/OutputStream/Reader/Writer | 抽象 read()/write(),子類實現具體設備 |
關鍵抽象類設計意圖
- InputStream/OutputStream:處理原始字節(圖片、視頻、二進制數據),不可直接實例化
- Reader/Writer:處理字符文本(自動處理編碼解碼),不可直接實例化
- File:路徑元數據操作(創建、刪除、屬性、目錄遍歷),不處理內容
- RandomAccessFile:隨機讀寫(指針定位),融合 DataInput/DataOutput,非流體系
實際開發選型指南
| 場景 | 推薦組合 | 理由 |
| 文本文件讀取 | BufferedReader br = new BufferedReader(new FileReader(file)) | 緩沖+字符流,按行高效讀取 |
| 文本文件寫入 | BufferedWriter bw = new BufferedWriter(new FileWriter(file)) | 緩沖批量寫入,減少系統調用 |
| 二進制文件複製 | FileInputStream + FileOutputStream 或 NIO Files.copy() | 字節流直接操作,NIO 零拷貝更快 |
| 對象序列化 | ObjectOutputStream/InputStream | 實現 Serializable,處理對象圖 |
| 數據類型讀寫 | DataOutputStream/InputStream | 跨平台基本類型二進制格式 |
| 控制台輸出 | System.out (PrintStream) | 格式化打印,自動 flush |
現代化替代:NIO.2 (Java 7+) 與 Stream API (Java 8+)
// NIO.2 文件操作(路徑、屬性、遍歷、複製、移動)
Path path = Paths.get("data.txt");
Files.lines(path).forEach(System.out::println); // 流式讀取行
Files.write(path, "content".getBytes(StandardCharsets.UTF_8));
// Stream API 處理行流
try (Stream lines = Files.lines(path)) {
lines.filter(l -> l.contains("error"))
.map(String::toUpperCase)
.forEach(System.out::println);
}
總結
理解 IO 類繼承體系的關鍵在於識別:四大抽象基類定義契約,裝飾者動態增強,適配器橋接字節/字符,具體實現對接設備。實際開發中,優先使用 Buffered 包裝,文本用 Reader/Writer,二進制用 InputStream/OutputStream,複雜場景拥抱 NIO.2 與 Stream API。