多次流关闭并打开同一文件错误
Multiple times stream close and open on same file error
我正在尝试以相同的方法使用两个 classes 从控制台读取输入 InputStreamReader 和 BufferedReader 。我关闭了前者 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
流。
因此,当您创建第二个 InputStreamReader
和 BufferedReader
时,您正在包装一个您之前关闭的流。
因此,当您尝试从新读者那里阅读时,您会遇到异常。
解决方案:关闭后,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
对象的引用...您之前关闭了它。
我正在尝试以相同的方法使用两个 classes 从控制台读取输入 InputStreamReader 和 BufferedReader 。我关闭了前者 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
流。
因此,当您创建第二个 InputStreamReader
和 BufferedReader
时,您正在包装一个您之前关闭的流。
因此,当您尝试从新读者那里阅读时,您会遇到异常。
解决方案:关闭后,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
对象的引用...您之前关闭了它。