我想知道为什么在使用
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));在两个不同的班级。
设置如下。
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上创建一个新的System.in,为什么这可能会导致流关闭错误?
类似的问题here。但是,没有解释为什么System.in会因为某种原因而关闭。
提前感谢!
发布于 2014-03-03 01:29:48
因为当您关闭BufferedReader时,所有的底层流都关闭了。THis是所有包装和从流到流的读/写类的例子。
这是一种方便,因此您不需要遍历实例化的整个对象集( 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();
}https://stackoverflow.com/questions/22136137
复制相似问题