用Java关闭Reader / Stream

时间:2015-10-23 14:19:02

标签: java io bufferedreader ioexception

在我的代码中,我必须从控制台读取用户输入:

class Demo {
    //...some code
    public String readUserInput() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String userInput = reader.readLine();
        reader.close();
        return userInput;
    }
}

第一次在Demo对象上使用方法readUserInput()时,一切正常。但是当我创建另一个Demo对象并调用方法时 - 它会抛出带有消息

的异常
  

“Stream closed”

任何人都可以告诉我,为什么我在不同的不同对象上有异常?谢谢你的关注。

2 个答案:

答案 0 :(得分:4)

问题在于:

new InputStreamReader(System.in)

当您关闭BufferedReader时,它会关闭InputStreamReader,而InputStreamReader又会关闭System.in。

contract of Closeable's .close()中解释了所有(有点),其中说:

  

关闭此流并释放与其关联的所有系统资源

因此,您第二次尝试阅读BufferedReader时,最终会导致数据从System.in读取,但不可用。因此你的错误。

更一般地说,您处理的资源很差。请阅读并学习使用try-with-resources语句。

答案 1 :(得分:0)

您正在关闭阅读器,关闭... System.in

在这种情况下,您不必关闭Stream。