多次流关闭并打开同一文件错误

Multiple times stream close and open on same file error

我正在尝试以相同的方法使用两个 classes 从控制台读取输入 InputStreamReaderBufferedReader 。我关闭了前者 class 的流并再次读取输入,但现在使用后者 class。如果我在调用 BufferedReader 流 read() 方法之前关闭前一个 class 流,则会显示错误。但是在方法结束时关闭 InputStreamReader 流时,它工作正常。

我的想法是- 由于我已经关闭了前者使用的流class,后一个流是独立于它的,因此不应该影响代码的运行。

public static void main(String[] args) throws Exception {


    //File file = new File("D:\IOSUMIT\new_file.txt");

    InputStreamReader isr= new InputStreamReader(System.in);

    System.out.println("your input " + (char)isr.read());



    isr.close();  //here error occurs


    InputStreamReader isrp= new InputStreamReader(System.in); // Line 1

    BufferedReader br = new BufferedReader(isrp);
    int temp = br.read();

    System.out.println("your input  Buffered" + (char)temp);



    br.close();

输出错误

4

your input 4Exception in thread "main" java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.read(Unknown Source)
    at IO.Q7.main(Q7.java:60)
InputStreamReader isr= new InputStreamReader(System.in);

在上一行中,isr 是充当输入流的引用reader(来自键盘等输入源)。所以一旦你关闭它,实际的输入流就会关闭。不是isr关闭了。

 InputStreamReader isrp= new InputStreamReader(System.in);

另一个引用 (isrp) 只是尝试使用在流上创建缓冲 reader 之前已关闭的流,因此不允许进一步读取(作为标准输入流,在System.in,已经关闭)。

此外,考虑对同一输入源使用 2 个输入流是一个疯狂的想法。您应该在打开的输入流上使用 buffered-reader 。只有在你读完你的全部输入之后,你才应该关闭流,最后。

问题出在

isr.close();  //here error occurs

当该行实际执行时,输入流关闭并且缓冲的reader无法找到关闭的流。您可以做的修复是注释掉 close 行并在所有计算之后执行它。 输入流一旦关闭就无法再次打开

让我们从这个开始:

isr.close();  //here error occurs

其实,这不是错误发生的地方。那是一条红鲱鱼。根据堆栈跟踪,异常实际上是由以下语句引发的:

int temp = br.read();

这是有道理的。 isr.close() 正在关闭 Reader 和它包装的输入流。该输入流是 System.in 流。

因此,当您创建第二个 InputStreamReaderBufferedReader 时,您正在包装一个您之前关闭的流。

因此,当您尝试从新读者那里阅读时,您会遇到异常。

解决方案:关闭后,System.in 流将保持关闭状态。所以不要关闭 System.in.


你问过:

Would not input stream be open again at commented Line 1 inside the BufferReader constructor ?

 InputStreamReader isrp= new InputStreamReader(System.in); // Line 1

简答:否

new 正在创建一个新的 InputStreamReader 实例来包装 System.in 的当前值。在这种情况下,该值是文件描述符 0 的 FileInputStream 对象的引用...您之前关闭了它。