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

Java FileInputStream 讀取檔案內容不全:System.out.write 緩衝區未刷新

     編輯:程式設計綜合問答

現象

檔案有 3 行,程式只輸出前 2 行。程式碼使用 `System.out.write(tem)` 逐位元組寫入標準輸出。

根因

`System.out` 是 `PrintStream`,`write(int b)` 方法**不自動刷新**,資料留在內部緩衝區。`print/println` 遇到換行符 (`\n`) 會自動 `flush()`。檔案前兩行結尾有換行,故自動輸出;第三行結尾無換行 (或為 EOF),緩衝區未刷新,程式結束前未顯示。

修正

while ((tem = in.read()) != -1) {
    System.out.write(tem);
}
System.out.flush(); // ★ 迴圈結束後強制刷新,輸出剩餘緩衝資料

更好的讀取寫法

  1. BufferedReader 逐行 (最常用):
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = br.readLine()) != null) System.out.println(line);
    }
    
  2. Files.readAllLines (Java 8+,小檔案):
    Files.lines(Paths.get(file)).forEach(System.out::println);
    
  3. InputStream.transferTo (Java 9+,高效複製):
    try (InputStream in = new FileInputStream(file)) {
        in.transferTo(System.out); // 直接管道傳輸,無緩衝問題
    }
    

教訓:使用 `write(int)` 寫入 `PrintStream` 時,務必在結束時呼叫 `flush()`;實務上盡量用高層 API 避免手動位元組處理。

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