BufferedReader的ready与readLine使用,以及Premature EOF异常

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

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

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

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

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

  以上摘自:http://blog.csdn.net/neusoftware_20063500/article/details/3723176

  实际上,在读网络数据的时候经常会遇到数据延迟等问题。这时候直接运行读网络流中的数据时很容易遇到 java.io.IOException: Premature EOF的异常。 这时就可以使用 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){
  //阻塞,等待一段时间
}

BufferedReader的ready与readLine使用,以及Premature EOF异常

时间: 2024-11-07 17:42:50

BufferedReader的ready与readLine使用,以及Premature EOF异常的相关文章

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

BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用socket.close()关闭不需要的socket. 从一个有若干行的文件中依次读取各行,处理后输出,如果用以下方法,则会出现除第一行外行首字符丢失现象 String str  = null;br=new BufferedReader(new FileReader(fileName));do{  str

hive报lzo Premature EOF from inputStream错误

今天dw组同事发邮件说有一个问题让帮解决一下,他们自己没能搞得定,以下问题解决过程: 1.hql insert overwrite table mds_prod_silent_atten_user partition (dt=20141110) select uid, host, atten_time from (select uid, host, atten_time from (select case when t2.uid is null then t1.uid else t2.uid e

Premature EOF from inputStream错误的不同原因

今天例行的任务报Premature EOF from inputStream的错误(具体log被刷屏刷掉了).根据这个关键信息去网上搜了下,有说lzo压缩指定方式不对的MapReduce使用lzo压缩注意,也有说节点或者通信出问题,或者文件操作超租期,实际上就是data stream操作过程中文件被删掉了,后者的意思在后知后觉下其实已经比较接近我遇到的情况了. 因此,我先检查了集群的节点,都是正常:而lzo的能性也因为最近没有对任务做更新也就排除了. 最后一个偶然去检查了下存储的数据,发现有一个

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

错误原文分析 文件操作超租期,实际上就是data stream操作过程中文件被删掉了.通常是因为Mapred多个task操作同一个文件,一个task完成后删掉文件导致.这个错误跟dfs.datanode.max.transfer.threads参数到达上限有关.这个是datanode同时处理请求的任务上限,总默认值是 4096,该参数取值范围[1 to 8192] hadoop docs hdfs-site.xml dfs.datanode.max.transfer.threads 4096 S

02_IO操作的基本规律(InputStream,OutputStream,Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWri

 模拟BufferedInputStream,编写一个类 package toto.IO; import java.io.IOException; import java.io.InputStream; class MyBufferedInputStream{ private InputStream in; private byte[] buf = new byte[1024*4]; private int pos = 0,count = 0; MyBufferedInputStream(I

被readLine()折腾了一把

虽然写IO方面的程序不多,但BufferedReader/BufferedInputStream倒是用过好几次的,原因是: 它有一个很特别的方法:readLine(),使用起来特别方便,每次读回来的都是一行,省了很多手动拼接buffer的琐碎: 它比较高效,相对于一个字符/字节地读取.转换.返回来说,它有一个缓冲区,读满缓冲区才返回:一般情况下,都建议使用它们把其它Reader/InputStream包起来,使得读取数据更高效. 对于文件来说,经常遇到一行一行的,特别相符情景. 这次是在蓝牙开发

IO流(二)——BufferedReader和BufferedWriter

BufferedReader和BufferedWriter 字符流的缓冲区:缓冲区的而出现提高了对数据的读写效率对应类:BufferedWriter  BufferedReader缓冲区要结合流才可以使用,在流的基础上对流的功能进行了增强.实际上BufferedReader和BufferedWriter是对FileReader和FileWriter的装饰模式.BufferedWriter: bufw.newLine(); public class BufferedWriterDemo { pri

Java IO6:字符流进阶及BufferedWriter、BufferedReader

原文:http://www.cnblogs.com/xrq730/p/4890052.html 字符流和字节流的区别 public static void main(String[] args) throws Exception{ File file = new File("D:/writer.txt"); Writer out = new FileWriter(file); // 声明一个String类型对象 String str = "Hello World!!!&quo

Java IO4:字符流进阶及BufferedWriter、BufferedReader

字符流和字节流的区别 拿一下上一篇文章的例子: 1 public static void main(String[] args) throws Exception 2 { 3 File file = new File("D:/writer.txt"); 4 Writer out = new FileWriter(file); 5 // 声明一个String类型对象 6 String str = "Hello World!!!"; 7 out.write(str);