Java 多次在同一文件上关闭和打开流错误
我试图使用两个类以相同的方法从控制台读取输入InputStreamReader和BufferedReader。我关闭了前一个类的流并再次读取输入,但现在使用后一个类。如果在调用BufferedReader stream read()方法之前关闭前一个类流,则显示错误。但是在方法末尾关闭InputStreamReader流时,它工作正常 我的想法是- 由于我已经关闭了前一个使用的类的流,后一个流独立于它,因此不应该影响代码的运行Java 多次在同一文件上关闭和打开流错误,java,file,io,bufferedreader,inputstreamreader,Java,File,Io,Bufferedreader,Inputstreamreader,我试图使用两个类以相同的方法从控制台读取输入InputStreamReader和BufferedReader。我关闭了前一个类的流并再次读取输入,但现在使用后一个类。如果在调用BufferedReader stream read()方法之前关闭前一个类流,则显示错误。但是在方法末尾关闭InputStreamReader流时,它工作正常 我的想法是- 由于我已经关闭了前一个使用的类的流,后一个流独立于它,因此不应该影响代码的运行 public static void main(String[] a
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();
输出错误
四,
在上一行中,isr是一个用作输入流读取器的引用(来自键盘等输入源)。所以一旦你关闭它,实际的输入流就会被关闭。并不是说isr已经关闭
InputStreamReader isrp= new InputStreamReader(System.in);
另一个引用(isrp)只是尝试使用在流上创建缓冲读取器之前已关闭的流,因此不允许进一步读取(因为System.in上的标准输入流已关闭)
而且,对于同一个输入源使用两个输入流也是一个疯狂的想法。您应该在打开的输入流上使用缓冲读取器。只有在阅读完所有输入之后,才应该关闭流。问题在于
isr.close(); //here error occurs
当实际执行该行时,输入流关闭,缓冲读取器无法找到关闭的流。您可以做的修复是注释掉结束行,并在所有计算之后执行它。
一旦输入流被关闭,就无法再次打开它让我们从以下内容开始:
isr.close(); //here error occurs
事实上,这不是错误发生的地方。那是一个骗局。根据stacktrace,异常实际上是由以下语句引发的:
int temp = br.read();
这是有道理的。isr.close()
正在关闭读卡器及其包装的输入流。该输入流是系统中的流
因此,当您随后创建第二个InputStreamReader
和BufferedReader
时,您正在包装一个以前关闭的流
因此,当你试图从新读者那里阅读时,你会得到一个例外
解决方案:一旦关闭,
流中的系统将保持关闭状态。所以不要在
中关闭系统
你问:
输入流不会在BufferReader构造函数内的注释行1处再次打开吗
InputStreamReader isrp= new InputStreamReader(System.in); // Line 1
简短回答:没有
new
正在创建一个新的InputStreamReader
实例,该实例封装了System.in的当前值。在本例中,该值是文件描述符0的FileInputStream
对象的引用。。。您以前关闭的。“它显示错误”stacktrace?输入流不会在BufferReader构造函数内的注释行1处再次打开吗??。由于引用isrp使用的是new,而不是previous,它将生成一个新的。@angrysumit-否,正如我在第2段中已经回答的,输入流在标准输入(System.in)时关闭,与您在第2行中尝试打开的一样。您可以使用任何其他输入(如文件)作为输入流。但是,相同的标准输入流不会再次打开。这会导致抛出该异常(java.io.IOException:streamclosed
)。
int temp = br.read();
InputStreamReader isrp= new InputStreamReader(System.in); // Line 1