[英]Multiple times stream close and open on same file error
我试图在同一方法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)
让我们以此开始:
isr.close(); //here error occurs
实际上,这不是发生错误的地方。 那是一条红鲱鱼。 根据stacktrace,以下语句实际上引发了异常:
int temp = br.read();
有道理。 isr.close()
正在关闭Reader及其包装的输入流。 该输入流是System.in
流。
因此,当您再创建第二个InputStreamReader
和BufferedReader
您正在包装以前关闭的流。
因此,当您尝试向新读者阅读时,您会遇到异常。
解决方案:关闭后, 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.