我的个人主页: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异常的更多相关文章

  1. java.io.IOException: Premature EOF

    http访问第三方系统的接口时,小概率抛出下面的异常: java.io.IOException: Premature EOF at sun.net.www.http.ChunkedInputStrea ...

  2. Java:java中BufferedReader的read()及readLine()方法的使用心得

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...

  3. 关于java中BufferedReader的read()及readLine()方法的使用心得

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...

  4. hive报lzo Premature EOF from inputStream错误

    今天dw组同事发邮件说有一个问题让帮解决一下.他们自己没能搞得定.下面问题解决过程: 1.hql insert overwrite table mds_prod_silent_atten_user p ...

  5. hbase_异常_03_java.io.EOFException: Premature EOF: no length prefix available

    一.异常现象 更改了hadoop的配置文件:core-site.xml  和   mapred-site.xml  之后,重启hadoop 和 hbase 之后,发现hbase日志中抛出了如下异常: ...

  6. spark 执行报错 java.io.EOFException: Premature EOF from inputStream

    使用spark2.4跟spark2.3 做替代公司现有的hive选项. 跑个别任务spark有以下错误 java.io.EOFException: Premature EOF from inputSt ...

  7. 解决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 ...

  8. java-IO流-字符流-FileReader、FileWriter、自定义小数组的拷贝、BufferedReader、BufferedWriter、readLine()和newLine()方法、LineNumberReader、使用指定的码表读写字符

    ###21.01_IO流(字符流FileReader) * 1.字符流是什么     * 字符流是可以直接读写字符的IO流     * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要 ...

  9. hadoop MR 任务 报错 "Error: java.io.IOException: Premature EOF from inputStream at org.apache.hadoop.io"

    错误原文分析 文件操作超租期,实际上就是data stream操作过程中文件被删掉了.一般是由于Mapred多个task操作同一个文件.一个task完毕后删掉文件导致. 这个错误跟dfs.datano ...

随机推荐

  1. phpcms:六、频道页(category.html)

    1.当前栏目的ID:{$catid}标题样式:{title_style($v[style])}(在添加内容或编辑内容的时候,标题右边 有一个选择颜色的块).{str_cut(strip_tags($v ...

  2. Java学习之Iterator(迭代器)的一般用法

    迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的I ...

  3. iPhone、iPod和iPad离线固件升级的方法

    我们知道iOS升级的过程过程超级简单,特别是在线升级只需要点击几个按钮就ok了,但是对于开发者来说,经常升级的iOS固件都是preview版的,需要自己下载好固件之后,手动来更新,我找了一下网上的资料 ...

  4. 20个经典bootsrtap后台html站点模板推荐

    今天为大家推荐20款不同风格的Bootstrap后台管理模板,每一款都经典可用,能预览和下载,保证让你挑得眼花缭乱. 1,Simpli flag蓝色 Simpli Flat蓝色管理模板是一款採用Fla ...

  5. python 间谍程序传输文件 socket编程

    本程序实现了,把目标机器的某个目录(可控)的所有的某种类型文件(可控)全部获取并传到己方的机器上. 1.用了base64的encode(infile,outfile)加密,以及decode(infil ...

  6. android内存优化之图片压缩和缓存

    由于手机内存的限制和网络流量的费用现在,我们在加载图片的时候,必须要做好图片的压缩和缓存. 图片缓存机制一般有2种,软引用和内存缓存技术. 1.压缩图片:压缩图片要既不能模糊,也不能拉伸图片. 图片操 ...

  7. delete语句与reference约束 FK_subplan_job_id冲突问题,导致job无法删除解决办法

    在SQL Server 2008上删除已运行维护计划后,维护计划job没有自动删除掉,手工再删除维护计划job,提示删除失败. 错误现象:delete  语句与 reference 约束"F ...

  8. Js 时间间隔计算(间隔天数)

    function GetDateDiff(startDate,endDate)  {      var startTime = new Date(Date.parse(startDate.replac ...

  9. uva11292贪心基础题目

    C - 贪心 基础 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bi ...

  10. Map基本用法

    Map的基本用法 map内部使用的是红黑树,在map内部所有的数据都是有序的 map插入有三种方法: insert(pair<int,string>(i,str)); myMap.inse ...