博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BufferedReader的ready与readLine使用,以及Premature EOF异常
阅读量:7100 次
发布时间:2019-06-28

本文共 1439 字,大约阅读时间需要 4 分钟。

我的个人主页:

  有些人在读取服务器端返回的数据的时候,使用了BufferedReader类的ready:

1 while(reader.ready()) {2  //执行读取操作,即readLine 3 }

  这个方法很经常被用到, 但是返回的却都是空,这是什么原因呢,查看了一下帮助文档,以及上网查了查,总结如下:

  1. ready是查看流是否已经准备好被读,是一个非阻塞的方法,所以会立刻返回,由于服务器没有准备好被读,所以会立刻返回,所以读取到的都是null。

  2. readLine是一个阻塞的方法,只要没有断开连接,就会一直等待,直到有东西返回,那么什么时候返回空呢,只有读到数据流最末尾,才返回null。

  以上摘自:

  实际上,在读网络数据的时候经常会遇到数据延迟等问题。

这时就可以使用 ready函数查看BufferedReader是否已经准备好。

while(!reader.ready){ //阻塞,等待一段时间 } while(reader.readLine()!==null){ //执行操作 }

  特别要注意的是当reader.readLine已经读完之后,如果继续执行ready操作,会返回false; 因此,下面两段代码可能造成死循环:

  1. 

while(reader.readLine()!==null){      //执行操作       while(!reader.ready){       //阻塞,等待一段时间       }  }

2. 

while(reader.readLine()!==null){  //执行操作  }  while(!reader.ready){  //阻塞,等待一段时间  }

 Premature EOF

在读取网络流的数据时很容易遇到 java.io.IOException: Premature EOF的异常。

  发生Premature EOF的可能有:

  1. 在stream到达EOF之前,stream已经结束。( no EOF marker),显然这种情况下很有可能是响应超时、服务端处理错误、网络问题、防火墙。
  2. EOF过早地出现了。( EOF marker comes earlier before it shoud be.)

目前,没有找到很好的有效的解决方法。因为,这个问题出现的原因有很多。有些是客户端问题,这种问题可以通过改善良好的代码习惯来杜绝。比如,要记住关闭流以及网络连接,合理使用网络和计算机资源。在读取网络流之前可以试探流是否已经准备好。

  本人也遇到过Premature EOF的问题,最开始这个问题很令人头疼。当时是一个多线程的程序(而且线程数相对较多,10个),虽然对于一些线程返回的结果正常,然而也有一大部分的Premature EOF异常。为此,我检查了一遍又一遍的代码,上网找了许多潜在的解决方法,但均没有很好地解决问题。

  考虑到这个异常有可能是服务器端的错误,以及我当时所调用的服务器的资源情况,最后我将线程数设置为2个这种异常便不再出现了。因此,可以猜测到程序的多线程调用造成了服务端程序的资源争抢等问题导致了Premature EOF异常。所以,在开发应用程序的过程中也应该注意到合理使用服务器的资源。

转载于:https://www.cnblogs.com/forzhongyou/p/3902765.html

你可能感兴趣的文章
iOS 模态视图,视图之间的切换
查看>>
iptables
查看>>
.NET自动识别GB2312与UTF-8编码的文件
查看>>
Linux下apache日志分析与状态查看方法
查看>>
hdu2412(树形dp)
查看>>
js返回函数, 函数名后带多个括号的用法及join()的注意事项
查看>>
【NOIP2007】矩阵取数
查看>>
关于VIM在Win10下的无意义折腾
查看>>
ibatis example Class 使用
查看>>
android的触摸事件(转)
查看>>
springMVC与struts2的区别
查看>>
【DB2数据库在windows平台上的安装】
查看>>
课后作业-阅读任务-阅读笔记-4
查看>>
Yii2数据缓存详解
查看>>
02Scala-函数定义、流程控制、异常处理入门实战
查看>>
jquery,smarty,dedecms的插件思路------dede未实践
查看>>
php pdo错误:SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
查看>>
Team Foundation Server:CodeUI Automation Test 学习笔记4
查看>>
Linux 小知识翻译 - 「cron」
查看>>
docker 一些简略环境搭建及部分链接
查看>>