InputStream (字節輸入流超類)
└─ FileInputStream (文件字節流)
Reader (字符輸入流超類)
├─ InputStreamReader (字節→字符橋梁,可指定編碼)
│ └─ FileReader (便利類,默認使用系統編碼)
└─ BufferedReader (緩衝讀取,高效讀行)
| 特性 | InputStreamReader | FileReader |
|---|---|---|
| 構造參數 | InputStream + charsetName | File / FileDescriptor / String path |
| 編碼控制 | 可顯式指定(如 UTF-8, GBK) | 僅用系統默認編碼,跨平台易亂碼 |
| 適用場景 | 需指定編碼、網絡流、壓縮流轉字符 | 本地文本文件、編碼與系統一致時 |
File file = new File("hello.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
FileReader fr = new FileReader("hello.txt");
BufferedReader br = new BufferedReader(fr);
BufferedReader 內部維護字符緩衝區,將底層的逐字節讀取轉為批量讀取,極大降低系統調用開銷。建議:所有高開銷的 Reader(FileReader, InputStreamReader)均應包裝 BufferedReader。
OutputStreamWriter(os, "UTF-8")InputStreamReader(is, "UTF-8")native2ascii 轉義或改用 XML/YAML。理解「字節流為基礎,字符流為封裝,編碼為橋梁」是掌握 Java IO 的關鍵。實際開發中,優先選擇 InputStreamReader + BufferedReader 組合,顯式指定 UTF-8 編碼,可消除 90% 的亂碼問題。