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

Java IO 核心:字節流與字符流的區別、選型與最佳實踐

     編輯:Java 程式設計入門

Java IO 體系中,字節流(InputStream/OutputStream)與字符流(Reader/Writer)是兩大根接口,理解其差異、轉換橋樑與適用場景,是高效處理文件、網絡、序列化的基石。

核心差異一覽

維度字節流字符流
基本單位字節(8 bit)字符(16 bit Unicode)
處理對象圖片、視頻、音頻、二進制文件、網絡流文本文件、字符串、控制台輸入輸出
編碼轉換無,直接讀寫原始字節內建編碼/解碼(默認平台編碼或指定 Charset)
緩衝機制通常不自帶緩衝,需套 BufferedInputStream通常不自帶緩衝,需套 BufferedReader/Writer
核心抽象類InputStream / OutputStreamReader / Writer
典型實現FileInputStream, ByteArrayInputStream, Socket.getInputStream()FileReader, StringReader, InputStreamReader

字節流與字符流關係圖

關鍵橋樑:InputStreamReader / OutputStreamWriter

字符流本質是字節流的裝飾器,負責「字節 ⇄ 字符」轉碼:

// 字節流 → 字符流(解碼)
Reader reader = new InputStreamReader(new FileInputStream("data.txt"), "UTF-8");

// 字符流 → 字節流(編碼)
Writer writer = new OutputStreamWriter(new FileOutputStream("out.txt"), "UTF-8");

務必顯式指定 Charset,否則依賴平台默認編碼(Windows GBK,Linux UTF-8),導致跨平台亂碼。

緩衝區與 flush() 陷阱

字符流常搭配 BufferedWriter,數據先寫入內存緩衝區,滿或調用 flush() 才真正落盤。

BufferedWriter bw = new BufferedWriter(new FileWriter("log.txt"));
bw.write("第一行");
bw.flush(); // 強制刷新,確保即時可見
bw.write("第二行");
bw.close(); // 關閉會自動 flush

忘記 flush/close 是文件寫入「丟數據」的首因。

選型決策樹

  1. 處理二進制文件(圖片、壓縮包、序列化對象) → 字節流。
  2. 處理文本文件(日誌、配置、CSV、JSON) → 字符流 + 指定 UTF-8。
  3. 需要高性能大文件複製 → FileChannel.transferTo()(NIO 零拷貝)或 BufferedInputStream/OutputStream 大緩衝區(8KB+)。
  4. 需要行讀取 → BufferedReader.readLine() 或 Files.lines() (Stream)。

常見錯誤與修正

錯誤代碼問題修正
new FileReader("中文.txt")隱式使用平台編碼,跨平台亂碼new InputStreamReader(new FileInputStream("中文.txt"), "UTF-8")
fw.write(str); // 無 flush/close數據停留在緩衝區,進程崩潰丟失try-with-resources 自動 close,或顯式 flush()
while((c = in.read()) != -1)單字節讀取,極慢用 BufferedInputStream + byte[] buf = new byte[8192]

總結

  • 字節流處理「原始數據」,字符流處理「文本數據」。
  • 轉換橋樑 InputStreamReader/OutputStreamWriter 必須指定編碼。
  • 讀寫文本 首選 BufferedReader/BufferedWriter,並善用 try-with-resources 保證資源釋放。
  • 大文件/高性能場景考慮 NIO FileChannel 或 mmap。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved