黑马程序员技术交流社区
标题:
关于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