IO (Input/Output) 是電腦與外部交換資料的介面。Java 核心庫 java.io 提供全面的 IO 介面:檔案讀寫、標準裝置輸出等。Java IO 以 流 為基礎進行序列化讀寫,所有資料串列化寫入輸出流或從輸入流讀入。此外,java.nio 提供 區塊 IO,支援高效能傳輸、讀寫鎖定、非同步 IO 等進階功能。
| 特性 | 流 IO (java.io) | 區塊 IO (java.nio) |
|---|---|---|
| 程式模型 | 串列流 | 通道 + 緩衝區 |
| 易用性 | 簡單直觀 | 較複雜 |
| 效能 | 一般 | 高 (系統呼叫少、零拷貝) |
| 適用場景 | 中小檔案、文字處理、網路串流 | 大檔案、高併發網路、記憶體映射檔 |
Java IO 採用 Decorator Pattern,依功能劃分 Stream,可動態組合所需功能:
InputStream / OutputStream (位元組) 、Reader / Writer (字元,自動處理編碼轉換)。FileInputStream, ByteArrayInputStream, Socket.getInputStream() 等。BufferedInputStream (緩衝)、DataInputStream (基本型別讀取)、GZIPInputStream (壓縮) 等,皆繼承 FilterInputStream。// 逐層包裝
FileInputStream fis = new FileInputStream("C:\\log.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis); // 可直接 readInt(), readUTF()
// 單行鏈式寫法
InputStream in = new DataInputStream(
new BufferedInputStream(
new FileInputStream("C:\\log.txt")));
InputStreamReader / OutputStreamWriter:位元組流 ↔ 字元流橋樑,指定 Charset (預設平台編碼)。BufferedReader / BufferedWriter:行緩衝,提供 readLine(), newLine()。PrintWriter:格式化輸出,println() 自動刷新。雙向傳輸管道,對應底層檔案描述符或 Socket。主要實作:
FileChannel:檔案隨機存取、記憶體映射、檔案鎖。SocketChannel, ServerSocketChannel, DatagramChannel:非阻塞網路 IO。固定大小容器,保存基本型別資料 (ByteBuffer, CharBuffer, IntBuffer 等)。核心屬性:
capacity:容量不可變。position:下一個讀寫位置。limit:尚有資料的邊界。關鍵操作:flip() (切換寫→讀)、clear() (重置位置)、compact() (保留未讀資料)。
單執行緒管理成千上萬 Channel,註冊關注事件 (OP_READ, OP_WRITE, OP_ACCEPT, OP_CONNECT),select() 阻塞直到有就緒 Channel,實現高併發 Reactor 模式。
java.io 裝飾者組合模式,熟練處理文字/二進位檔案。AsynchronousFileChannel (JDK 7+)、MemoryMappedFile、零拷貝 FileChannel.transferTo()。