BufferedReader bufd = new BufferedReader(new InputStreamReader(System.in));
System.out.println(bufd.readLine());
它会报异常:
aaaa
Exception in thread "main" java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
at java.io.BufferedInputStream.read(BufferedInputStream.java:308)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)aaaa
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at com.itheima.Text.main(Text.java:15)
但是其他的输入流就没有没有这样的问题:
BufferedInputStream f = new BufferedInputStream(new FileInputStream("f:\\2\\a.java"));
byte[] b = new byte[1024];
int len=0;
while((len = f.read(b))!=-1){
System.out.println(new String(b,0,len));
}
f.close();
BufferedInputStream fr = new BufferedInputStream(new FileInputStream("f:\\2\\a.java"));
这个就是正常的,不会包异常,请问这是怎么回事?作者: Friendy89 时间: 2013-8-9 01:12
因为System.in对应的是键盘录入,相当于从系统中获取流对象,你把它关闭了,想要再继续录入数据就会出现异常。只有重新启动程序才可正常运行
而读取硬盘上的数据,由于硬盘上的数据已经写好了,你把流关闭了,他就不会再继续读数据了,所以不会报异常作者: 钟佩桓 时间: 2013-8-9 01:32
System.in关闭了重新打开是不可能的 但是可以用System.setIn(InputStream in);用这个方法设置一个System.in其实他内部是调用jvm的本地方法 不论你new 多少个BufferedReader这些都是外层的缓冲流。也叫高级流。但是实际上底层用的还是System.in。
这个流被关闭了。你再new 个BufferedReader也没用。System.in是System类被加载的时候就分配好的final变量。所以你System.in已经被关闭了。你外层的流在怎么new也是无用,因为底层的流被关闭了。
然而你读取的file对象 这个文件是在硬盘上已经存在的 即使流已经关闭 到那时数据却是实实在在存在于硬盘上的 所以不会报异常作者: 会飞的狼 时间: 2013-8-9 10:34