A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 会飞的狼 中级黑马   /  2013-8-9 01:03  /  1760 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在同一个类中如果一个关于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"));
这个就是正常的,不会包异常,请问这是怎么回事?

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

5 个回复

正序浏览
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对象 这个文件是在硬盘上已经存在的 即使流已经关闭 到那时数据却是实实在在存在于硬盘上的 所以不会报异常
回复 使用道具 举报
Friendy89 发表于 2013-8-9 01:12
因为System.in对应的是键盘录入,相当于从系统中获取流对象,你把它关闭了,想要再继续录入数据就会出现异 ...

谢谢 学到了
回复 使用道具 举报
钟佩桓 发表于 2013-8-9 01:32
System.in关闭了重新打开是不可能的 但是可以用System.setIn(InputStream in);用这个方法设置一个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对象 这个文件是在硬盘上已经存在的 即使流已经关闭 到那时数据却是实实在在存在于硬盘上的 所以不会报异常

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
因为System.in对应的是键盘录入,相当于从系统中获取流对象,你把它关闭了,想要再继续录入数据就会出现异常。只有重新启动程序才可正常运行
而读取硬盘上的数据,由于硬盘上的数据已经写好了,你把流关闭了,他就不会再继续读数据了,所以不会报异常

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马