Java IO 的本質是解決設備間數據傳輸問題,典型場景包括:硬碟 ↔ 記憶體、網路套接字 ↔ 應用程式、鍵盤/螢幕 ↔ 程式邏輯。所有流操作最終都歸結為「讀取來源」與「寫入目的地」兩個動作。
位元組流直接處理二進位資料,無需編碼/解碼,適用於圖片、影片、音訊、壓縮檔等二進位檔案。
InputStream:抽象基類,定義 read() 等核心方法FileInputStream:從檔案系統讀取原始位元組BufferedInputStream:內部維護 8KB 緩衝陣列,大幅減少系統呼叫次數,提升讀取效能OutputStream:抽象基類,定義 write() 等核心方法FileOutputStream:向檔案系統寫入原始位元組BufferedOutputStream:同樣 8KB 緩衝,批次刷新至磁碟字符流 = 位元組流 + 編碼/解碼器。專門處理文本資料,內部自動依平台預設或指定 Charset 進行轉換。
Reader:抽象基類FileReader:便利類,實際委派 InputStreamReader,預設採用平台編碼(Windows 為 GBK)BufferedReader:8192 字符緩衝,新增 readLine() 按行讀取,極適合文本檔解析Writer:抽象基類FileWriter:對應 OutputStreamWriter,同樣受限於預設編碼BufferedWriter:緩衝寫入,提供跨平台 newLine()當需要指定編碼時,必須使用轉換流:
InputStreamReader:位元組輸入流 → 字符輸入流OutputStreamWriter:位元組輸出流 → 字符輸出流兩者構造方法均支援 Charset 參數,解決 FileReader/Writer 無法指定編碼的缺陷。
package cn.xlucas.io;
import java.io.*;
public class IoDemo1 {
public static void main(String[] args) throws IOException {
writeFile();
readFile();
}
// 以 UTF-8 寫入中文
public static void writeFile() throws IOException {
try (FileOutputStream fos = new FileOutputStream("F:\\a.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8")) {
osw.write("中國");
}
}
// 以 UTF-8 讀取並輸出到控制台
public static void readFile() throws IOException {
try (FileInputStream fis = new FileInputStream("F:\\a.txt");
InputStreamReader isr = new InputStreamReader(fis, "utf-8")) {
int ch;
while ((ch = isr.read()) != -1) {
System.out.print((char) ch);
}
}
}
// 鍵盤輸入示範:System.in → BufferedReader
public static void testInput() throws IOException {
try (InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr)) {
System.out.println("請輸入一行文字:");
System.out.println("您輸入了:" + br.readLine());
}
}
}
| 場景 | 推薦流 | 關鍵點 |
|---|---|---|
| 二進位檔案複製 | BufferedInputStream → BufferedOutputStream | 不解碼,效能最高 |
| 文本檔讀取(指定編碼) | InputStreamReader + BufferedReader | 支援 UTF-8/GBK 等任意 Charset |
| 文本檔寫入(指定編碼) | OutputStreamWriter + BufferedWriter | 跨平台換行符自動處理 |
| 網路通訊傳輸文本 | Socket.getInputStream() → InputStreamReader | 協議層通常約定 UTF-8 |
StandardCharsets.UTF_8 而非字串常數,獲得編譯期檢查;