在 Java 中关闭 Reader/Stream

Closing Reader/Stream in Java

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

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"

谁能告诉我,为什么我在不同的不相等对象上出现异常?感谢您的关注。

问题出在这里:

new InputStreamReader(System.in)

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

这就是 contract of Closeable's .close() 中的所有(某种)解释,它说:

Closes this stream and releases any system resources associated with it.

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


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

您正在关闭 reader,这将关闭... System.in

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