黑马程序员技术交流社区

标题: 关于system.in的一个问题 [打印本页]

作者: 会飞的狼    时间: 2013-8-9 01:03
标题: 关于system.in的一个问题
在同一个类中如果一个关于System.in的流关闭了,就不能再开启了,如下程序段:
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                System.out.println(bufr.readLine());
                bufr.close();
               
                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
钟佩桓 发表于 2013-8-9 01:32
System.in关闭了重新打开是不可能的 但是可以用System.setIn(InputStream in);用这个方法设置一个System.in ...

谢谢 学到了
作者: 会飞的狼    时间: 2013-8-9 10:35
Friendy89 发表于 2013-8-9 01:12
因为System.in对应的是键盘录入,相当于从系统中获取流对象,你把它关闭了,想要再继续录入数据就会出现异 ...

谢谢 学到了
作者: 心灵之歌    时间: 2013-8-9 12:16
System.in是键盘录入,相当于从系统中获取流对象,你把它关闭了,想要再继续录入数据就会出现异常。只有重新启动程序才可正常运行
而读取硬盘上的数据,由于硬盘上的数据已经写好了,你把流关闭了,他就不会再继续读数据了,所以不会报异常

System.in关闭了重新打开是不可能的 但是可以用System.setIn(InputStream in);用这个方法设置一个System.in其实他内部是调用jvm的本地方法    不论你new 多少个BufferedReader这些都是外层的缓冲流。也叫高级流。但是实际上底层用的还是System.in。
这个流被关闭了。你再new 个BufferedReader也没用。System.in是System类被加载的时候就分配好的final变量。所以你System.in已经被关闭了。你外层的流在怎么new也是无用,因为底层的流被关闭了。
然而你读取的file对象 这个文件是在硬盘上已经存在的 即使流已经关闭 到那时数据却是实实在在存在于硬盘上的 所以不会报异常




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2