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 ...
随机推荐
- 关于static静态
静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { private static $speed = ...
- inconvertible types; cannot cast 'android.supoort.v4.app.Fragment' to 'com.example.sevenun.littledemo.fragment.NewsTitleFragment'
inconvertible types; cannot cast 'android.supoort.v4.app.Fragment' to 'com.example.sevenun.littledem ...
- 基本NT式驱动代码结构
#include <ntddk.h> void DriverUnload(IN PDRIVER_OBJECT DriverObject);NTSTATUS MyCreateClose(IN ...
- 【转】FLV视频封装格式详解
Overview Flash Video(简称FLV),是一种流行的网络格式.目前国内外大部分视频分享网站都是采用的这种格式. File Structure 从整个文件上开看,FLV是由The FLV ...
- (转)iOS7界面设计规范(8) - UI基础 - 术语和措辞
讨厌周一,讨厌一周.今天中午交互组聚餐,却很开心:大家都是很厉害的人,你可以感到他们身上的能量,可以感到有些什么东西正在推着自己尽力向前走.这是一种很健康的状态,同时也很难得,自然越发需要珍惜.从无到 ...
- Android开发有用的站点
在github上面找到一个个人认为比較好的站点,好在能够方便下载开发工具.我的AndroidStudio就是在上面下载的.安装了一直在使用.该 网址主要收集整理Android开发所需的Android ...
- oracle之replace结合substr的使用
select * from( SELECT TMM.ORDER_ID, TMM.IMPORT_ID, TMM.TMALL_ORDER_ID, TMM.MEMBER_NAME, TMM.ALIPAY_U ...
- C#中的一些复习。
摘自http://www.cnblogs.com/yuchengping/p/3151537.html 等日后自己来完善. 基本概念 1..NET是平台,C#是.NET上的一门语言. 2.C#的异常处 ...
- VS2010不能打开预编译的网站源码的原因是什么?(转之csdn)
原问题: 今天将写好的一个网站源码目录拷贝到另一台电脑上,但打开时提示: 你要打开一个预编译的网站,你可以查看该站点,但对它进行更改可能会造成该网站停止运行,若要修改站点,建议先编辑原始网站中的 ...
- 如何安装windows7系统
在XP时代,光驱对于我们而言仅仅是装系统用,不过在Win7发布之后,可以用U盘直接安装,省时省力. 首先在互联网下载UltraISO光盘映像文件制作/编辑/格式转换工具,(当然还有其它如WinIS ...