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

Java IO 流體系深度解析:從位元組到字符的完整指南

     編輯:Java 相關知識

核心問題:IO 解決什麼?

Java IO 的本質是解決設備間數據傳輸問題,典型場景包括:硬碟 ↔ 記憶體、網路套接字 ↔ 應用程式、鍵盤/螢幕 ↔ 程式邏輯。所有流操作最終都歸結為「讀取來源」與「寫入目的地」兩個動作。

一、位元組流家族

位元組流直接處理二進位資料,無需編碼/解碼,適用於圖片、影片、音訊、壓縮檔等二進位檔案。

1. 輸入位元組流

  • InputStream:抽象基類,定義 read() 等核心方法
  • FileInputStream:從檔案系統讀取原始位元組
  • BufferedInputStream:內部維護 8KB 緩衝陣列,大幅減少系統呼叫次數,提升讀取效能

2. 輸出位元組流

  • OutputStream:抽象基類,定義 write() 等核心方法
  • FileOutputStream:向檔案系統寫入原始位元組
  • BufferedOutputStream:同樣 8KB 緩衝,批次刷新至磁碟

二、字符流家族

字符流 = 位元組流 + 編碼/解碼器。專門處理文本資料,內部自動依平台預設或指定 Charset 進行轉換。

1. 輸入字符流

  • Reader:抽象基類
  • FileReader:便利類,實際委派 InputStreamReader,預設採用平台編碼(Windows 為 GBK)
  • BufferedReader:8192 字符緩衝,新增 readLine() 按行讀取,極適合文本檔解析

2. 輸出字符流

  • Writer:抽象基類
  • FileWriter:對應 OutputStreamWriter,同樣受限於預設編碼
  • BufferedWriter:緩衝寫入,提供跨平台 newLine()

三、轉換流:橋接位元組與字符

當需要指定編碼時,必須使用轉換流:

  • InputStreamReader:位元組輸入流 → 字符輸入流
  • OutputStreamWriter:位元組輸出流 → 字符輸出流

兩者構造方法均支援 Charset 參數,解決 FileReader/Writer 無法指定編碼的缺陷。

四、實戰程式碼範例

package cn.xlucas.io;

import java.io.*;

public class IoDemo1 {
    public static void main(String[] args) throws IOException {
        writeFile();
        readFile();
    }

    // 以 UTF-8 寫入中文
    public static void writeFile() throws IOException {
        try (FileOutputStream fos = new FileOutputStream("F:\\a.txt");
             OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8")) {
            osw.write("中國");
        }
    }

    // 以 UTF-8 讀取並輸出到控制台
    public static void readFile() throws IOException {
        try (FileInputStream fis = new FileInputStream("F:\\a.txt");
             InputStreamReader isr = new InputStreamReader(fis, "utf-8")) {
            int ch;
            while ((ch = isr.read()) != -1) {
                System.out.print((char) ch);
            }
        }
    }

    // 鍵盤輸入示範:System.in → BufferedReader
    public static void testInput() throws IOException {
        try (InputStreamReader isr = new InputStreamReader(System.in);
             BufferedReader br = new BufferedReader(isr)) {
            System.out.println("請輸入一行文字:");
            System.out.println("您輸入了:" + br.readLine());
        }
    }
}

五、選型速查表

場景推薦流關鍵點
二進位檔案複製BufferedInputStream → BufferedOutputStream不解碼,效能最高
文本檔讀取(指定編碼)InputStreamReader + BufferedReader支援 UTF-8/GBK 等任意 Charset
文本檔寫入(指定編碼)OutputStreamWriter + BufferedWriter跨平台換行符自動處理
網路通訊傳輸文本Socket.getInputStream() → InputStreamReader協議層通常約定 UTF-8

六、最佳實踐提醒

  1. 優先使用 try-with-resources(JDK 7+)自動關閉資源,避免洩漏;
  2. 大檔案處理時務必加緩衝,否則頻繁系統呼叫導致效能崩潰;
  3. 明確指定 StandardCharsets.UTF_8 而非字串常數,獲得編譯期檢查;
  4. 字符流僅用於純文本,混合二進位協議請堅持位元組流並自行解碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved