繁体   English   中英

BufferedReaders跨类读取System.in

[英]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所有基础流都已关闭。 对于所有包装流以及从流中读取/写入流的类,情况就是如此。

这是一种便利,因此您无需遍历实例化的整个对象集( InputStreamInputStreamReader和最后的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM