黑马程序员技术交流社区

标题: 关于BufferedReader问题 [打印本页]

作者: 成果    时间: 2012-2-6 14:27
标题: 关于BufferedReader问题
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狼的微博
作者: 余海龙    时间: 2012-2-6 15:03
String strLine = bfr.readLine();
获取第一行字符串后,会执行if语句中的代码,然后将读到的字符串打印到控制台。
if语句执行完后会执行到  bfr.close();  语句,即关闭流资源,当流资源关闭后,将不能再读取键盘键入得数据。
应该将 bfr.close(); 语句放在while循环外,并放在finally语句中,这样是为了不管怎样资源到最后都必须关闭。
作者: 王文龙    时间: 2012-2-6 15:37
对啊,具体是丢些什么数据啊....

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

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

大可不必啊,因为关闭之后会再创建新流啊..
作者: 成果    时间: 2012-2-6 16:14
已弄清楚。其实执行了这个bfr.close();new InputStreamReader(System.io)这个对象也就close()了。然后再执行while循环之时由于System.io流已经关闭了。已成了null。故而产生问题。其实最好是将BufferedReader bfr= new BufferedReader(new InputStreamReader(System.io));写到while外部这样的话也不会每执行一次循坏就创建一次对象。总结。写书while(true)循环时一定要注意new关键字产生的对象。

作者: 刘基军    时间: 2012-2-6 16:16
是抛出异常,而不是丢失数据。---赞同1楼同志的说法。
另外:
BufferedReader bfr= new BufferedReader(new InputStreamReader(System.io));
应该是:
BufferedReader bfr= new BufferedReader(new InputStreamReader(System.in));

作者: 梅雄新    时间: 2012-2-6 16:21
本帖最后由 梅雄新 于 2012-2-6 16:24 编辑

楼主的情况我之前做网络那章时服务端向客户端发数据的练习时,有个一客户端可以接收到,别一个接收不到,后来我发现了问题
就楼主的程序以说明
楼主的while循环是一直执行的,问题就是在于楼主每一次执行时都重新new了一个BufferedReader bfr= new BufferedReader(new InputStreamReader(System.in));
应该把 bfr定义在while外面,这样保持读取输入流只有一个字符流,这样就不会出现丢失数据的情况了,楼主试试
作者: 吴亨    时间: 2012-2-7 19:09
应该将bfr.close();方法放到while循环外部,否则执行一次就关闭资源
作者: 最初的理想    时间: 2012-2-7 19:47
都说到了     BufferedReader bfr= new BufferedReader(new InputStreamReader(System.io));流的构建要放到循环的外面,保证程序中只引用了一个流对象,流的关闭要放在循环的外面,同时要用finally语句括起来,同时在关闭的时候要先判断一下流对象是否是null 否则会发生空指针异常,
finally{
  if (in!=null){
     in.close();
}
}
流操作中的异常处理和一些规范详见毕老师io视频,规范的书写总是能保证少犯错吧                       




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