BufferedReader的ready与readLine使用,以及Premature EOF异常
我的个人主页:http://www.foreyou.net
有些人在读取服务器端返回的数据的时候,使用了BufferedReader类的ready:
while(reader.ready()) {
//执行读取操作,即readLine
}
这个方法很经常被用到, 但是返回的却都是空,这是什么原因呢,查看了一下帮助文档,以及上网查了查,总结如下:
1. ready是查看流是否已经准备好被读,是一个非阻塞的方法,所以会立刻返回,由于服务器没有准备好被读,所以会立刻返回,所以读取到的都是null。
2. readLine是一个阻塞的方法,只要没有断开连接,就会一直等待,直到有东西返回,那么什么时候返回空呢,只有读到数据流最末尾,才返回null。
以上摘自:http://blog.csdn.net/neusoftware_20063500/article/details/3723176
实际上,在读网络数据的时候经常会遇到数据延迟等问题。
这时就可以使用 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异常。所以,在开发应用程序的过程中也应该注意到合理使用服务器的资源。
BufferedReader的ready与readLine使用,以及Premature EOF异常的更多相关文章
- java.io.IOException: Premature EOF
http访问第三方系统的接口时,小概率抛出下面的异常: java.io.IOException: Premature EOF at sun.net.www.http.ChunkedInputStrea ...
- Java:java中BufferedReader的read()及readLine()方法的使用心得
BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...
- 关于java中BufferedReader的read()及readLine()方法的使用心得
BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...
- hive报lzo Premature EOF from inputStream错误
今天dw组同事发邮件说有一个问题让帮解决一下.他们自己没能搞得定.下面问题解决过程: 1.hql insert overwrite table mds_prod_silent_atten_user p ...
- hbase_异常_03_java.io.EOFException: Premature EOF: no length prefix available
一.异常现象 更改了hadoop的配置文件:core-site.xml 和 mapred-site.xml 之后,重启hadoop 和 hbase 之后,发现hbase日志中抛出了如下异常: ...
- spark 执行报错 java.io.EOFException: Premature EOF from inputStream
使用spark2.4跟spark2.3 做替代公司现有的hive选项. 跑个别任务spark有以下错误 java.io.EOFException: Premature EOF from inputSt ...
- 解决HDFS无法启动namenode,报错Premature EOF from inputStream;Failed to load FSImage file, see error(s) above for more info
一.情况描述 启动hadoop后发现无法打开hdfs web界面,50070打不开,于是jps发现少了一个namenode: 查看日志信息,发现如下报错: 2022-01-03 23:54:10,99 ...
- java-IO流-字符流-FileReader、FileWriter、自定义小数组的拷贝、BufferedReader、BufferedWriter、readLine()和newLine()方法、LineNumberReader、使用指定的码表读写字符
###21.01_IO流(字符流FileReader) * 1.字符流是什么 * 字符流是可以直接读写字符的IO流 * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要 ...
- hadoop MR 任务 报错 "Error: java.io.IOException: Premature EOF from inputStream at org.apache.hadoop.io"
错误原文分析 文件操作超租期,实际上就是data stream操作过程中文件被删掉了.一般是由于Mapred多个task操作同一个文件.一个task完毕后删掉文件导致. 这个错误跟dfs.datano ...
随机推荐
- git 查看文件修改记录
今天追了个几年前留下来的坑, 在 git 里追溯修改过程坑死个爹, 具体方法估计没多久又会忘, 还是记下来以后有的参考 大部分教程都会告诉大家使用 git log 来查看对应文件的修改记录, 就像这样 ...
- Android 百度地图API(01)_开发环境 HelloBaiduMap
转载于:http://blog.csdn.net/lmj623565791/article/details/37729091 转载于:http://blog.csdn.net/crazy1235/ar ...
- 第26讲 对话框AlertDialog的自定义实现
第26讲对话框AlertDialog的自定义实现 比如我们在开发过长当中,要通过介绍系统发送的一个广播弹出一个dialog.但是dialog必需是基于activity才能呈现出来,如果没有activi ...
- 【转】YUV格式&像素
一幅彩色图像的基本要素是什么? 说白了,一幅图像包括的基本东西就是二进制数据,其容量大小实质即为二进制数据的多少.一幅1920x1080像素的YUV422的图像,大小是1920X1080X2=4147 ...
- hdu 4055 Number String(dp)
Problem Description The signature of a permutation is a string that is computed as follows: for each ...
- 删除ubuntu旧内核
ubuntu的内核经常升级,而老内核并不自动卸载.时间长了,就有一大堆内核垃圾,需要我们手动去清理. 先用uname -a 查看当前内核版本: xzc@xzc-HP-ProBook-4446s:~$ ...
- ASP.NET 实现PDF文件下载
本文介绍了一种在ASP.NET中下载文件的方法. 方法一:可能是最简单的.最短的方式: Response.ContentType = "application/pdf"; Resp ...
- nyoj201 作业题
作业题 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 3 描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方 ...
- Qt使用QGraphicsView实现滑动窗体效果
QGraphicsView用来显示一个滚动视图区的QGraphicsScene内容.QGraphicsScene提供了QGraphicsItem的容器功能.通常与QGraphicsView一起使用来描 ...
- Android Xfermode 实战 实现圆形、圆角图片
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42094215,本文出自:[张鸿洋的博客] 1.概述 其实这篇本来准备Androi ...