繁体   English   中英

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

[英]Multiple times stream close and open on same file error

我试图在同一方法InputStreamReaderBufferedReader中使用两个类从控制台读取输入。 我关闭了前一类的流,并再次读取输入,但是现在使用后一类。 如果我在调用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)

让我们以此开始:

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对象的引用。

InputStreamReader isr= new InputStreamReader(System.in);

在上一行中,isr是充当输入流读取器的引用(来自像键盘这样的输入源)。 因此,一旦关闭它,实际的输入流就会关闭。 不是说isr关闭了。

 InputStreamReader isrp= new InputStreamReader(System.in);

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

同样,想到为同一输入源使用2个输入流只是一个疯狂的想法。 您应该在打开的输入流上使用缓冲读取器。 只有在阅读了整个输入之后,才最终应关闭流。

问题出在

isr.close();  //here error occurs

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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