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

时间:2016-04-14 11:42:14

标签: java file io bufferedreader inputstreamreader

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

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

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)

3 个答案:

答案 0 :(得分:3)

让我们从这开始:

isr.close();  //here error occurs

实际上,这不是错误发生的地方。那是一只红鲱鱼。根据stacktrace,以下语句实际引发了异常:

int temp = br.read();

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

因此,当您创建第二个InputStreamReaderBufferedReader时,您将包装先前已关闭的流。

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

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

你问:

  

不会在BufferReader构造函数中的注释行1再次打开输入流吗?

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

简短回答:不。

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

答案 1 :(得分:1)

InputStreamReader isr= new InputStreamReader(System.in);

在上面的行中,isr是一个用作输入流阅读器的参考(来自键盘等输入源)。因此,一旦关闭它,实际的输入流就会关闭。这不是isr关闭。

 InputStreamReader isrp= new InputStreamReader(System.in);

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

另外,考虑对同一输入源使用2个输入流只是一个疯狂的想法。您应该在打开的输入流上使用缓冲读取器。只有在你读完全部输入后,才能最后关闭流。

答案 2 :(得分:1)

问题在于

isr.close();  //here error occurs

当实际执行该行时,输入流关闭,缓冲的阅读器无法找到关闭的流。您可以做的修复是注释掉关闭线并在所有计算后执行它。 关闭输入流后,无法重新打开