首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java IO 體系深度解析:從流到 NIO 的進化之路

     編輯:Java 相關知識

什麼是 IO?核心抽象:流

IO (Input/Output) 是程式與外部世界 (檔案、網路、控制台) 交換資料的介面。Java 核心庫 java.io 以 流 (Stream) 為核心抽象:資料被序列化為位元組序列寫入輸出流,或從輸入流讀取並反序列化。這種「水管」模型簡單直觀,但因逐位元組處理,效率受限於頻繁的系統呼叫與記憶體拷貝。

兩大體系:位元組流 vs 字元流

維度位元組流 (XxxStream)字元流 (XxxReader/Writer)
處理單位Byte (8 bits)Char (16 bits, UTF-16)
適用場景圖片、聲音、二進位檔、網路傳輸文字檔、XML、JSON、含中文的文本
編碼轉換需自行處理內建編碼/解碼器 (Charset)
基類InputStream / OutputStreamReader / Writer

橋接樁:InputStreamReader / OutputStreamWriter 可在兩者間轉換,指定 Charset (如 UTF-8) 即可正確處理中文。

設計模式大師作:裝飾者模式

Java IO 傳統體系是 Decorator Pattern 教科書級應用:

  • Component:InputStream / OutputStream (抽象介面)
  • ConcreteComponent:FileInputStream, ByteArrayInputStream (資料源頭/終點)
  • Decorator:FilterInputStream / FilterOutputStream (功能增強基類)
  • ConcreteDecorator:BufferedInputStream (緩衝), DataInputStream (基本型別讀取), GZIPInputStream (壓縮)…

組裝範例:new BufferedInputStream(new FileInputStream("log.txt")) —— 先接檔案源頭,再疊加緩衝功能,靈活組合、動態擴充。

NIO (New IO):塊傳輸與非阻塞的革命

JDK 1.4 引入 java.nio,核心抽象轉向 Channel (通道) 與 Buffer (緩衝區):

  • 塊傳輸:直接操作記憶體塊,減少 JVM 與 OS 間拷貝,大幅提升大檔案吞吐量。
  • 直接記憶體:ByteBuffer.allocateDirect() 分配堆外記憶體,避免 GC 壓力,配合 OS 零拷貝 (Zero-copy) 效能極致。
  • 非阻塞 IO:Selector + SelectableChannel 實現單執行緒管理成千上萬連結,是 Netty、Undertow 等高效能網路框架的基石。
  • 記憶體映射檔案:MappedByteBuffer 將檔案直接映射至進程位址空間,隨機存取極快。

實戰代碼對比:傳統 IO vs NIO 檔案複製

傳統 IO (緩衝流)

try (InputStream in = new BufferedInputStream(new FileInputStream("src.dat"));
     OutputStream out = new BufferedOutputStream(new FileOutputStream("dst.dat"))) {
    byte[] buf = new byte[8192];
    int len;
    while ((len = in.read(buf)) != -1) {
        out.write(buf, 0, len);
    }
}

NIO (Channel + Buffer)

try (FileChannel in = FileChannel.open(Paths.get("src.dat"), StandardOpenOption.READ);
     FileChannel out = FileChannel.open(Paths.get("dst.dat"), 
         StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {
    // 零拷貝:直接在核心空間傳輸,不經用戶空間
    long transferred = in.transferTo(0, in.size(), out);
}

選型指南

  • 中小檔案、簡單邏輯、相容舊代碼 → 傳統 IO (BufferedStream) 開發效率最高。
  • 大檔案 (GB 級)、高併發網路、追求極致吞吐/低延遲 → NIO / NIO.2 (Path, Files, AsyncChannel)。
  • 現代專案建議直接使用 java.nio.file.Files 靜態工具類 (Files.copy(), Files.readAllLines() 等),API 簡潔且底層自動優化。

延伸閱讀

  • Oracle 官方教程:Java IO/NIO 教程
  • 《Java NIO》—— Ron Hitchens 著,NIO 經典名著。
  • Netty 官方文檔:深入理解 Reactor 模式與零拷貝實現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved