2010-07-08 87 views
8

我的任务是(通过一个非常大的,不断增长的文件逐行读取)。这里基本上是我现在在做什么:使用BufferedReader从大的,不断增长的文件中读取

BufferedReader rd = //initialize BufferedReader 
String line; 
while(true){ 
    while((line=rd.readLine())==null){ 
     try{ 
      Thread.sleep(1000); 
     }catch(InterruptedException e){ 
      //handle exception 
     } 
    } 
    //process line 
} 

所以我的BufferedReader只是在文件的结尾挂起,直到有要读更多的东西。这很好,但有一个问题 - 如果readLine被调用,而写入该文件的进程正处于写入行的中间。然后,第一次调用readLine将返回该行的第一部分,下一次调用将返回第二部分。但我真的需要这两部分,我需要完整的线条。

更具体地说,我的问题发生在下列事件交错发生:

  1. 写作过程中写入最行
  2. 的readLine()被调用
  3. 写作过程中完成该行,并添加换行符
  4. 的readLine()被调用

结果是每个的readLine( )提取写入过程输出的整个行的一部分。它的行为与预期的一样,因为每次调用它时,都会到达文件末尾,因此会返回读取的内容。

所以基本上我需要的功能是一个BufferedReader,它早些时候返回null一个readLine;一个在它之后没有给你一条线,而不是在它之后的EOF。因此,如果它找到EOF,它不会返回到该点的行,它将返回null,并在文件写入后返回该行,并且后面有一个新行。

我大概可以通过更直接地处理FileReader并基本上重写BufferedReader来实现一个粗略的方法,但我不知道如何有效地执行此操作。我的实现可能不会像真正的BufferedReader那样快,我想避免在数据被读取的时候减慢程序的速度。

回答

2

您可以从BufferedReader的源头开始,并重写 String readLine(boolean ignoreLF)方法,如果在行结束之前发现EOF,将导致麻烦。 (不幸的是它不能由于包装范围而受损)

1

BufferedReader的开始并不意味着直到它到达流的彻底结束返回null。换句话说,我不希望它有史以来它返回null后返回非空。

我有些惊讶,它给了你部分行,尽管 - 我希望它阻止,直到它有一个完整的行。

+1

我还惊奇地发现了这一点,但它如果有更多的被添加到该文件,则返回null后返回非空。 也许我应该更清楚地说明局部线条 - 我用更多描述编辑了原始问题。问题是BufferedReader表现得如预期的那样,只是它所做的并不是我想要的。 – 2010-07-08 17:54:30

0

像堆栈器说的,最好的方法是构造一个继承Bufferedreader的类。我发现当BufferedReader达到EOF时,它几乎注定要失败。如果你想继续阅读,或者检查是否有新的东西,你可以随时重新打开并跳过。在实践中,如果你确切地知道在哪里跳到,它不会花费很长时间。看看这个问题的答案。他在阅读器上创建了一个reopenat()函数,以便刷新阅读器。

BufferedReader reset fail after read to end of file

相关问题