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

Java IO 體系深度解析:從裝飾器模式到 NIO 零拷貝

     編輯:Java 相關知識

IO 核心抽象:流與塊

  • 流 IO:java.io 基於流(Stream)串行化讀寫,API 簡單但效率受限於頻繁系統調用
  • 塊 IO (NIO):java.nio 基於通道與緩衝區,支援內存映射、零拷貝、非阻塞 IO,高吞吐場景首選

流體系雙軌制

字節流字符流區別
InputStream/OutputStreamReader/Writer字符流自動處理編碼轉換(Unicode↔本地編碼)

兩者成對出現:FileInputStream ↔ FileReader、BufferedInputStream ↔ BufferedReader。

裝飾器模式:動態組合功能

核心類繼承關係:

  • 數據源節點流:FileInputStream、ByteArrayInputStream、PipedInputStream
  • 裝飾器流(繼承 FilterInputStream):BufferedInputStream、DataInputStream、GZIPInputStream、ObjectInputStream

實戰組合:緩衝文件讀取


// 經典嵌套寫法
InputStream in = new BufferedInputStream(
    new FileInputStream("C:\\log.txt")
);

// 或分步構建(便於調試)
FileInputStream fis = new FileInputStream("C:\\log.txt");
BufferedInputStream bis = new BufferedInputStream(fis);

同理,輸出流組合:new BufferedOutputStream(new FileOutputStream("out.dat"))。

NIO 核心三件套

  1. Channel(通道):雙向傳輸管道,如 FileChannel、SocketChannel、ServerSocketChannel
  2. Buffer(緩衝區):固定大小容器,ByteBuffer、CharBuffer 等,支援 flip()/compact() 狀態切換
  3. Selector(選擇器):單線程多路複用,註冊 OP_READ/OP_WRITE/OP_ACCEPT 事件

零拷貝範例


FileChannel in = FileChannel.open(Paths.get("big.dat"), StandardOpenOption.READ);
FileChannel out = FileChannel.open(Paths.get("copy.dat"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
in.transferTo(0, in.size(), out); // 內核態直接傳輸,無用戶態拷貝

學習路線建議

  1. 掌握 java.io 裝飾器組合邏輯
  2. 理解字符編碼處理(InputStreamReader、Charset)
  3. 進階學習 NIO:Buffer 狀態機、Selector 事件循環、FileChannel 內存映射
  4. 實戰 Netty 等高性能網絡框架源碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved