0

我想知道为什么我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,为什么这可能导致流关闭错误?

类似的问题在这里。没有解释为什么 System.in 因某种原因关闭。

提前致谢!

4

1 回答 1

1

因为当您关闭时,BufferedReader所有底层流都已关闭。所有包装和读取/写入流的类都是这种情况。

这是一种方便,因此您无需遍历您已实例化的整个对象集(the InputStream、theInputStreamReader和最后的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. 如果底层流是 aFileInputStream而不是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();

}
于 2014-03-03T01:29:48.053 回答