Java 的 readLine 在 Scoket 要注意的地方

比如需要判断一个串是否结束  12345/n/n  用两个 /n 来判断结束。

 

通常一开始都会这么写

 

while( br.readLine()!=null ) {

    // dosomething

}

 

但是会发现这样永远也不会结束退出,因为跟读文本的时候不一样。后面仔细读 API 发现描述是

 

 

读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('/n')、回车 ('/r') 或回车后直接跟着换行。
返回:
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

 

 

Reads a line of text. A line is considered to be terminated by any one of a line feed ('/n'), a carriage return ('/r'), or a carriage return followed immediately by a linefeed.

Returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached

 

也就是说要到达流的末尾,才会null,看源码:

 

if (nextChar >= nChars) { /* EOF */
   if (s != null && s.length() > 0)
     return s.toString();
   else
     return null;
}

 

仅有流到达末尾,才能返回null,而socket的流本来就是趋于无限的,根本不知道何时才会结尾,所以条件永远都满足不了。

 

因此不能用 null 来判串,而要用空串来判断

 

String str=null;
  do{
   str=br.readLine();

   // dosomething
}while( !"".equals( str ) );

写出来备忘下,我也没仔细读API,自以为是的以为跟文件流结束差不多。悔恨,不知道有多少人会犯同样的错误呢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值