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

Java IO 核心:字節流與字符流區別深度解析

     編輯:Java 相關知識

前言

Java IO 體系中,字節流(Byte Stream)與字符流(Character Stream)是兩大核心支柱。理解它們的區別、轉換關係及適用場景,是高效處理文件、網絡、控制台輸入輸出的基礎。本文從底層原理到代碼實戰全方位解析。

1. 核心概念對比

維度字節流字符流
處理單元單個字節(8 bit)Unicode 碼元(char,16 bit)
基類InputStream / OutputStreamReader / Writer
默認緩衝無(需 BufferedInputStream)有(內部使用字節數組緩衝)
典型用途二進制數據(圖片、視頻、音頻、序列化對象)文本數據(TXT、XML、JSON、CSV、日誌)
編碼轉換不處理編碼自動處理字符集編解碼(默認平台編碼或指定 Charset)

2. 字節流深度剖析

2.1 InputStream 核心方法

public abstract int read() throws IOException; // 讀取單字節,-1 表示末尾
public int read(byte[] b) throws IOException;  // 批量讀取,底層仍循環調用 read()

關鍵點:read(byte[]) 內部仍逐字節調用 read(),未利用內存緩衝,頻繁調用導致磁盤 IO 開銷大。必須包裝 BufferedInputStream 獲得性能提升。

3. 字符流工作原理

字符流本質是 字節流 + 編碼轉換器:

  • 寫入:字符序列(Unicode) → 指定編碼 → 字節序列 → 寫入文件。
  • 讀取:字節序列 → 指定編碼解碼 → 字符序列(Unicode) → 內存。

因此字符流內部自帶緩衝區,累積轉換後的字節再批量寫入,效率高於裸字節流。

3.1 FileWriter 實戰演示

public class FileWriterDemo {
    public static void main(String[] args) {
        FileWriter fw = null;
        try {
            fw = new FileWriter("demo.txt");
            fw.write("demo");
        } finally {
            if (fw != null) fw.close();
        }
    }
}

未指定編碼時,使用平台默認編碼(Windows 為 GBK,Linux 為 UTF-8)。生成的 demo.txt 十六進制為 64 65 6D 6F(ASCII/UTF-8 編碼)。

4. 字節流與字符流互相轉換

橋梁類:InputStreamReader、OutputStreamWriter。

// 字節流 → 字符流(指定 UTF-8 編碼)
BufferedReader reader = new BufferedReader(
    new InputStreamReader(new FileInputStream("data.txt"), StandardCharsets.UTF_8));

// 字符流 → 字節流
BufferedWriter writer = new BufferedWriter(
    new OutputStreamWriter(new FileOutputStream("out.txt"), StandardCharsets.UTF_8));

最佳實踐:始終顯式指定 StandardCharsets.UTF_8,避免跨平台亂碼。

5. 選型指南

  1. 處理圖片、視頻、二進制協議、對象序列化 → 字節流(+ BufferedInputStream/OutputStream)。
  2. 處理文本文件、配置文件、網頁源碼、日誌 → 字符流(+ BufferedReader/Writer)。
  3. 不確定文件類型或需同時處理文本與二進制 → 使用字節流,必要時轉字符流。

6. NIO.2 現代替代方案(JDK 7+)

// 讀取所有行(自動關閉流)
List<String> lines = Files.readAllLines(Paths.get("data.txt"), StandardCharsets.UTF_8);
// 寫入文本
Files.write(Paths.get("out.txt"), "內容".getBytes(StandardCharsets.UTF_8));

Files、Paths API 更簡潔、支持符號鏈接、屬性讀取,推薦新項目優先使用。

總結

字節流處理原始二進制,字符流封裝編碼轉換並內建緩衝。實際開發中:文本用字符流(指定 UTF-8),二進制用字節流(加緩衝),轉換靠 Bridge 類,新項目優先考慮 java.nio.file.Files。牢記這條主線,IO 處理不再迷茫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved