在 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
在这种情况下,您不必关闭流。
在我的代码中,我必须从控制台读取用户输入:
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
在这种情况下,您不必关闭流。