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

Java 文件讀取阻塞問題:BufferedReader.readLine() 卡死排查

     編輯:程式設計綜合問答

現象

Debug 顯示程序卡在 `String line = rd.readLine();`,無法繼續執行,`java.util` 包似乎未被使用,主類也未運行。

根因分析

IO 阻塞:`readLine()` 會一直等待直到讀到換行符、EOF 或發生異常。常見原因:

  1. 文件路徑錯誤:`FileReader` 構造沒有拋出異常(文件存在),但路徑指向一個**命名管道、設備文件或網絡掛載點**,數據源不產生換行符。
  2. 流未正確關閉/刷新:寫入端未 `flush()` 或 `close()`,導致讀取端看不到 EOF。
  3. 異常被吞沒:`catch (IOException e)` 中只有 `throw new ErrorException(e);`,若 `ErrorException` 未被捕獲,線程終止但調試器顯示停在 `readLine()` 內部。

排查步驟

  1. 在 `catch` 塊和 `throw` 行打斷點,確認是否拋出異常。
  2. 簡化代碼測試:硬編碼已知存在的文本文件路徑,驗證讀取邏輯本身無誤。
  3. 檢查 `DICTIONARY_FILE` 常量定義的路徑是否為絕對路徑,工作目錄是否正確。
  4. 使用 `Files.lines(Path)` (Java 8+) 替代手動 `BufferedReader`,自動處理資源關閉。

簡化測試代碼

Path path = Paths.get("D:/data/dict.txt"); // 確定存在的文件
try (Stream<String> lines = Files.lines(path)) {
    lines.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

若簡化版正常,說明業務邏輯中的路徑或文件源有問題。

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