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

Java 關閉包裝 System.in 的 BufferedReader 會導致標準輸入流永久關閉

     編輯:程式設計疑難解答

現象

while(true) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println(br.readLine());
    br.close(); // 這裡關閉了 System.in
}
第二次迴圈 readLine() 拋出 IOException: Stream closed。

原因

BufferedReader 為裝飾模式,關閉外層流會級聯關閉內層流(System.in)。System.in 為進程唯一標準輸入,關閉後無法重新開啟。

正確做法

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true) {
    String line = br.readLine();
    if (line == null) break; // EOF (Ctrl+D / Ctrl+Z)
    System.out.println(line);
}
// 程式結束前才 close(或根本不 close,JVM 退出自動回收)
br.close();

原則

  • 標準流(System.in/out/err)全程只開啟/關閉一次。
  • 若需重複提示輸入,保持 BufferedReader 實例複用,勿在迴圈中重建與關閉。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved