2016-04-14 41 views
2

我想从控制台读取输入使用两个类在相同的方法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(); 

OUTPUT ERROR

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) 
+0

“它显示错误”stacktrace? – 2016-04-14 11:44:22

回答

3

让我们开始与此:

isr.close(); //here error occurs 

其实,这是不是在错误发生。那是一只红鲱鱼。根据堆栈跟踪,以下语句实际上抛出异常:

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
InputStreamReader isr= new InputStreamReader(System.in); 

在上述线,ISR是一个参考充当输入流读取器(来自如键盘的输入源)。所以一旦关闭它,实际的输入流就会被关闭。这并不是说封闭。

InputStreamReader isrp= new InputStreamReader(System.in); 

另一参考文献(ISRP)只试图使用已经在数据流生成一个缓冲阅读器前被预先关闭该流,并因此没有进一步读数被允许(作为标准输入流,对系统的。已经关闭)。

此外,对于相同的输入源使用2个输入流,这只是一个疯狂的想法。您应该在打开的输入流上使用缓冲读取器。只有在你读完整个输入之后,最后才能关闭流。

+0

不会输入流在BufferReader构造函数内的注释行1再次打开??。由于引用isrp使用** new **,而不是使用previous,它会创建一个新的。 – angrysumit

+1

@angrysumit - 不,因为我已经在第2段中回答过了,输入流在标准输入(System.in)上关闭,与第2行中打开的输入流相同。您可以使用任何其他输入(如文件)作为输入流。但是,这个相同的标准输入流将不会再次打开。并且,这导致抛出异常('java.io.IOException:Stream closed')。 –

1

问题是与

isr.close(); //here error occurs 

当实际执行行,输入流关闭,缓冲的读者是无法找到走出封闭流。您可以做的修复是注释掉关闭线并在所有计算后执行它。 一旦输入流已关闭,不能再重新打开

相关问题