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

Java IO 流體系全景(一):節點流、過濾流、字節流、字符流與常用流實戰

     編輯:Java 綜合教學

流的核心分類

維度分類基礎類說明
數據單位字節流InputStream / OutputStream以 8-bit 字節為單位,處理圖片、視頻、二進制數據
字符流Reader / Writer以 16-bit Unicode 字符為單位,處理文本,自動處理編碼轉換
角色節點流FileInputStream 等直接連接數據源/目的地(文件、記憶體、網絡)
過濾流BufferedInputStream 等包裝其他流,提供緩衝、轉換、數據類型化等增強功能

字節流核心 API

InputStream

  • int read()、int read(byte[] b)、int read(byte[] b, int off, int len)
  • long skip(long n)、int available()
  • void mark(int readlimit)、void reset()、boolean markSupported()
  • void close()

OutputStream

  • void write(int b)、void write(byte[] b)、void write(byte[] b, int off, int len)
  • void flush()、void close()

字符流核心 API

Reader/Writer 方法簽名與字節流對應,參數類型為 char[] 或 String。

流的套接(裝飾器模式)實戰

典型鏈路:FileInputStream → BufferedInputStream → DataInputStream

  • 節點流負責連接文件。
  • 緩衝流提升批量讀寫效率(減少系統調用)。
  • 數據流提供 readInt()、readUTF() 等類型化讀取。

四大常用流家族實戰

1. 文件流

// 字節複製
try (FileInputStream in = new FileInputStream("src.txt");
     FileOutputStream out = new FileOutputStream("dest.txt")) {
    byte[] buf = new byte[8192];
    int len;
    while ((len = in.read(buf)) != -1) out.write(buf, 0, len);
}

// 字符複製(自動編碼)
try (FileReader in = new FileReader("src.txt");
     FileWriter out = new FileWriter("dest.txt")) {
    char[] buf = new char[4096];
    int len;
    while ((len = in.read(buf)) != -1) out.write(buf, 0, len);
}

2. 緩衝流

  • BufferedInputStream/OutputStream:字節緩衝,構造可指定緩衝區大小(預設 8KB)。
  • BufferedReader/Writer:字符緩衝,提供 readLine()、newLine() 便利方法。
  • 關鍵:flush() 強制寫出,close() 會自動 flush。

3. 管道流:線程間通信

// 生產者線程
PipedOutputStream pos = new PipedOutputStream();
new Thread(() -> {
    try (PrintWriter pw = new PrintWriter(pos)) {
        for (int i=0;i<10;i++) pw.println("msg-"+i);
    } catch (IOException e) { e.printStackTrace(); }
}).start();

// 消費者線程
PipedInputStream pis = new PipedInputStream(pos);
try (BufferedReader br = new BufferedReader(new InputStreamReader(pis))) {
    String line;
    while ((line = br.readLine()) != null) System.out.println("收到:" + line);
}

也可先建立兩端再 connect()。管道流實現記憶體級零拷貝傳輸,適合生產者-消費者模式。

4. 綜合案例:押韻單詞處理(管道流鏈路)

流程:文件讀取 → 逆序線程 → 排序線程 → 逆序還原 → 控制台輸出

Reader source = new FileReader("words.txt");
Reader piped1 = reverse(source);   // 線程1:每行逆序
Reader piped2 = sort(piped1);      // 線程2:全量排序
Reader finalReader = reverse(piped2); // 線程3:再次逆序還原
new BufferedReader(finalReader).lines().forEach(System.out::println);

每個處理階段運行在獨立線程,透過 PipedReader/Writer 串聯,展示流套接與多線程管道協作的強大表達力。

總結

  • 掌握 字節/字符、節點/過濾 二維分類,選型無疑慮。
  • 善用 try-with-resources 確保資源釋放。
  • 緩衝流是性能優化首選,管道流解決線程間流式傳輸。
  • 轉換流 InputStreamReader/OutputStreamWriter 是字節與字符世界的橋樑,必須顯式指定 Charset 避免平台預設編碼差異。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved