Java IO 採用流(Stream)模型處理數據輸入輸出:
| 維度 | 輸入流 | 輸出流 |
|---|---|---|
| 方向 | 數據源 → 程序 (InputStream/Reader) | 程序 → 目的地 (OutputStream/Writer) |
| 數據單元 | 字節流(8-bit,處理二進制:圖片、視頻、所有文件) 字符流(16-bit char,處理文本,自動編碼轉換) | |
| 功能角色 | 節點流:直接連接數據源(FileInputStream)處理流:包裝其他流,增強功能( BufferedInputStream、DataInputStream) | |
FileInputStream/FileOutputStream:文件節點流ByteArrayInputStream/ByteArrayOutputStream:內存字節數組流BufferedInputStream/BufferedOutputStream:緩衝流,大幅提升讀寫效率(內部維護 8KB 默認緩衝區)DataInputStream/DataOutputStream:按基本類型讀寫(int、double、UTF 字符串等)try (InputStream in = new BufferedInputStream(new FileInputStream("data.bin"))) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
// 處理 buffer[0..len-1]
}
}
FileReader/FileWriter:文件字符節點流(依賴默認編碼,生產環境不推薦)InputStreamReader/OutputStreamWriter:字節→字符橋樑,可指定編碼(UTF-8/GBK)BufferedReader/BufferedWriter:文本讀寫首選,支援 readLine()、newLine()PrintWriter/PrintStream:格式化輸出,不拋異常,System.out 即 PrintStream// 讀取
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream("file.txt"), "UTF-8"))) {
String line;
while ((line = br.readLine()) != null) { ... }
}
// 寫入
try (BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("out.txt"), "UTF-8"))) {
bw.write("內容"); bw.newLine();
}
ObjectOutputStream/ObjectInputStream:將對象圖持久化為字節序列Serializable 接口(標記接口,無方法)transient 關鍵字排除敏感/非持久化字段serialVersionUID 顯式聲明版本號,防止反序列化失效PrintWriter:println()、printf()、format(),自動 flush 選項InputStreamReader/OutputStreamWriter:編碼轉換核心,解決中文亂碼根本方案File 代表文件/目錄路徑,不直接讀寫數據。核心能力:路徑解析、屬性查詢(長度、權限、時間)、目錄遍歷、創建/刪除/重命名。構建 File 對象不觸發磁盤操作。
| 模型 | 特點 | 適用場景 |
|---|---|---|
| BIO (Blocking IO) | 同步阻塞,一請求一線程 | 連接數少、低併發 |
| NIO (New IO) | 同步非阻塞,Channel + Buffer + Selector,一線程多路複用 | 高併發、長連接(Netty 基石) |
| AIO (Asynchronous IO) | 異步非阻塞,回調/CompletionHandler,OS 級異步 | 超高併發、大文件傳輸 |
BufferedReader/Writer + 顯式指定 UTF-8 編碼BufferedInputStream/OutputStream + 合適緩衝區(8KB-64KB)ObjectOutputStream + serialVersionUID + transient