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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 成果 黑马帝   /  2012-2-6 14:27  /  3726 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

while(true)
{
    BufferedReader bfr= new BufferedReader(new InputStreamReader(System.io));
                        String strLine = bfr.readLine();
    if(strLine != null)

    {
               System.out.println("hi:" + strLine );
    }
    else
    {
                return;
    }
   bfr.close();
}
为什么在这过程中会数据丢失。


该贴已经同步到 寻找幸福的13狼的微博

评分

参与人数 1技术分 +1 收起 理由
admin + 1 丢失啥数据,要说清楚

查看全部评分

7 个回复

倒序浏览
String strLine = bfr.readLine();
获取第一行字符串后,会执行if语句中的代码,然后将读到的字符串打印到控制台。
if语句执行完后会执行到  bfr.close();  语句,即关闭流资源,当流资源关闭后,将不能再读取键盘键入得数据。
应该将 bfr.close(); 语句放在while循环外,并放在finally语句中,这样是为了不管怎样资源到最后都必须关闭。

评分

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

查看全部评分

回复 使用道具 举报
对啊,具体是丢些什么数据啊....

你看代码第二行最后: System.in 才是键盘输入.

楼上说把关闭资源代码写到循环外,

大可不必啊,因为关闭之后会再创建新流啊..

评分

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

查看全部评分

回复 使用道具 举报
已弄清楚。其实执行了这个bfr.close();new InputStreamReader(System.io)这个对象也就close()了。然后再执行while循环之时由于System.io流已经关闭了。已成了null。故而产生问题。其实最好是将BufferedReader bfr= new BufferedReader(new InputStreamReader(System.io));写到while外部这样的话也不会每执行一次循坏就创建一次对象。总结。写书while(true)循环时一定要注意new关键字产生的对象。

评分

参与人数 1黑马币 +2 收起 理由
admin + 2 弄清楚了,接下来需要把标题改成已解决!.

查看全部评分

回复 使用道具 举报
是抛出异常,而不是丢失数据。---赞同1楼同志的说法。
另外:
BufferedReader bfr= new BufferedReader(new InputStreamReader(System.io));
应该是:
BufferedReader bfr= new BufferedReader(new InputStreamReader(System.in));

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 梅雄新 于 2012-2-6 16:24 编辑

楼主的情况我之前做网络那章时服务端向客户端发数据的练习时,有个一客户端可以接收到,别一个接收不到,后来我发现了问题
就楼主的程序以说明
楼主的while循环是一直执行的,问题就是在于楼主每一次执行时都重新new了一个BufferedReader bfr= new BufferedReader(new InputStreamReader(System.in));
应该把 bfr定义在while外面,这样保持读取输入流只有一个字符流,这样就不会出现丢失数据的情况了,楼主试试

评分

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

查看全部评分

回复 使用道具 举报
吴亨 黑马帝 2012-2-7 19:09:25
7#
应该将bfr.close();方法放到while循环外部,否则执行一次就关闭资源

评分

参与人数 1技术分 +1 收起 理由
admin + 1 加分鼓励!

查看全部评分

回复 使用道具 举报
都说到了     BufferedReader bfr= new BufferedReader(new InputStreamReader(System.io));流的构建要放到循环的外面,保证程序中只引用了一个流对象,流的关闭要放在循环的外面,同时要用finally语句括起来,同时在关闭的时候要先判断一下流对象是否是null 否则会发生空指针异常,
finally{
  if (in!=null){
     in.close();
}
}
流操作中的异常处理和一些规范详见毕老师io视频,规范的书写总是能保证少犯错吧                       

评分

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

查看全部评分

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