【转载】BufferedReader的ready与r…
来源:互联网 发布:cnc简单宏程式编程实例 编辑:程序博客网 时间:2024/06/05 22:42
原文地址:BufferedReader的ready与readLine使用,以及PrematureEOF异常
有些人在读取服务器端返回的数据的时候,使用了BufferedReader类的ready:
1 while(reader.ready()) {2 //执行读取操作,即readLine 3 }
这个方法很经常被用到,但是返回的却都是空,这是什么原因呢,查看了一下帮助文档,以及上网查了查,总结如下:
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){ //阻塞,等待一段时间 }
在读取网络流的数据时很容易遇到java.io.IOException: Premature EOF的异常。
发生PrematureEOF的可能有:
1. 在stream到达EOF之前,stream已经结束。( no EOFmarker),显然这种情况下很有可能是响应超时、服务端处理错误、网络问题、防火墙。
2. EOF过早地出现了。( EOF marker comes earlier before it shoud be.)
目前,没有找到很好的有效的解决方法。因为,这个问题出现的原因有很多。有些是客户端问题,这种问题可以通过改善良好的代码习惯来杜绝。比如,要记住关闭流以及网络连接,合理使用网络和计算机资源。在读取网络流之前可以试探流是否已经准备好。
本人也遇到过PrematureEOF的问题,最开始这个问题很令人头疼。当时是一个多线程的程序(而且线程数相对较多,10个),虽然对于一些线程返回的结果正常,然而也有一大部分的PrematureEOF异常。为此,我检查了一遍又一遍的代码,上网找了许多潜在的解决方法,但均没有很好地解决问题。
考虑到这个异常有可能是服务器端的错误,以及我当时所调用的服务器的资源情况,最后我将线程数设置为2个这种异常便不再出现了。因此,可以猜测到程序的多线程调用造成了服务端程序的资源争抢等问题导致了PrematureEOF异常。所以,在开发应用程序的过程中也应该注意到合理使用服务器的资源。
- 【转载】BufferedReader的ready与r…
- 认识BufferedReader的readLine、ready,以及InputStream的available
- 认识BufferedReader的readLine、ready,以及InputStream的available
- R与JAVA的整合【转载】
- BufferedReader与InputStream的心得
- onload 与$.ready 的区别
- onload与ready的区别
- java bufferedreader 与inputstream的区别
- InputStreamReader和BufferedReader的理解与用法
- BufferedReader、LineNumberReader的作用与用法
- BufferedWriter与BufferedReader的基本用法
- jquery的ready与js的onload
- window.onload与jquery的$(document).ready
- onload与$(document).ready()的区别
- window.onload与$(documetn).ready()的区别
- window.onload与$(document).ready()的区别
- window.onload 与 document.ready 的区别
- $(document).ready() 与 window.onload的区别
- NestedScrollView嵌套RecyclerView只显示一行的问题
- listview 中实现 checkb…
- java字符串与二进制的相互转…
- 关于java中Pattern.compile…
- nothing is impossible
- 【转载】BufferedReader的ready与r…
- mp4文件格式解析(一)
- TCP缓存
- 【转载】http 返回码 40…
- LightOJ 1245 Harmonic Number (II)
- C#开发之List泛型集合
- asp.net 微信支付 实例代码
- Java 定时器的使用:每天定…
- 关于JAVA中如何判断一个文件…