Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多次在同一文件上关闭和打开流错误_Java_File_Io_Bufferedreader_Inputstreamreader - Fatal编程技术网

Java 多次在同一文件上关闭和打开流错误

Java 多次在同一文件上关闭和打开流错误,java,file,io,bufferedreader,inputstreamreader,Java,File,Io,Bufferedreader,Inputstreamreader,我试图使用两个类以相同的方法从控制台读取输入InputStreamReader和BufferedReader。我关闭了前一个类的流并再次读取输入,但现在使用后一个类。如果在调用BufferedReader stream read()方法之前关闭前一个类流,则显示错误。但是在方法末尾关闭InputStreamReader流时,它工作正常 我的想法是- 由于我已经关闭了前一个使用的类的流,后一个流独立于它,因此不应该影响代码的运行 public static void main(String[] a

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

四,

在上一行中,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