[英]BufferedReaders reading System.in across classes
我想知道为什么我得到一个java.io.IOException: Stream closed
使用时java.io.IOException: Stream closed
错误
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
在2个不同的班级中。
设置如下。
public class SomeClass{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//br.readSomeStuff
br.close();
new SomeOtherClass(); //defo not passing the br along to the new class!
}
public class SomeOtherClass{
public SomeOtherClass(){
method():
}
private void method(){
BufferedReader br = new BufferedReader(new InputStreamReader(System.in))
br.readLine();
// results into an IOEXCEPTION Stream close
}
}
当我在创建另一个类之后关闭第一个类中的BufferedReader时,问题就消失了。 我不明白为什么这会给问题。 我正在System.in上创建一个新的BufferedReader,为什么这可能导致流关闭错误?
这里有类似的问题。 尽管由于某些原因,无法解释WHY System.in已关闭。
提前致谢!
因为当您关闭BufferedReader
所有基础流都已关闭。 对于所有包装流以及从流中读取/写入流的类,情况就是如此。
这是一种便利,因此您无需遍历实例化的整个对象集( InputStream
, InputStreamReader
和最后的BufferedReader
)并关闭所有对象。
一个简单的测试将证明这一点:
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.close();
// Will throw IOException
int i = System.in.read();
}
System.in
并不特殊; 这是一个InputStream
。 如果说底层流是FileInputStream
而不是stdin
,则会发生同样的事情:
public static void main(String[] args) throws IOException
{
File f = new File("SomeFileName");
FileInputStream fis = new FileInputStream(f);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
br.close();
// throw IOException
int i = fis.read();
}
鉴于通常这些构造函数都是链式的(如您的示例中所示),必须保留并关闭每个构造函数会很烦人。
想象一下,每次要使用流时都必须执行以下操作:
public static void main(String[] args) throws IOException
{
File f = new File("SomeFileName");
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(irs);
// Use the BufferedReader
br.close();
isr.close();
fis.close();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.