InputStream/OutputStream):以 **字節(byte,8 位)** 為單位讀寫,**不轉換編碼**,處理二進制數據(圖片、視頻、壓縮包、序列化對象)。Reader/Writer):以 **字符(char,Java 內部 UTF-16,2 字節)** 為單位讀寫,**自動處理編碼轉換**(文件編碼 ↔ UTF-16),處理文本文件(XML、JSON、CSV、日誌)。「一次讀 8 位」即**每次讀取 1 個 byte**(read() 返回 int 0~255 或 -1)。緩衝流(BufferedInputStream)內部會批量讀取填充緩衝區,但對外接口仍是逐字節或逐字節數組。
| 場景 | 推薦流 | 理由 |
|---|---|---|
| 圖片/視頻/二進制文件 | 字節流 | 無編碼概念,逐字節拷貝保證位級精確 |
| 文本文件(中文/多語言) | 字符流 + 指定編碼 | 自動完成 GBK/UTF-8 → UTF-16 轉換,避免亂碼 |
| 網絡通信協議 | 字節流 | 協議通常定義二進制幀結構 |
| 控制台輸入輸出 | 字符流 | System.in/out 本質是字符流 |
// 字節流 → 字符流(指定源編碼)
InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"), "GBK");
BufferedReader br = new BufferedReader(isr);
// 字符流 → 字節流(指定目標編碼)
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf8.txt"), "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
理解「字節是存儲/傳輸單位,字符是內存處理單位」,選擇流類型即清晰明了。