2012-02-24 36 views
0

我有一个进程(实际上是一个web服务器),它将从客户端进入的POST作为日志文件写入日志文件。BufferedReader readline在行完成之前

然后,我有一个单独的进程,倒像是在一个循环(尾-f)日志文件:

  BufferedReader reader = new BufferedReader(new FileReader(logFilePath)); 
      String line = null; 

      while (true) 
      { 
        if ((line = reader.readLine()) != null) 
        { 
          if (firstLine == null) firstLine = line; 
          processLine(line); 
          continue; 
        } 

        try 
        { 
          Thread.sleep(sleepTime); 
          long ts = System.currentTimeMillis(); 
        } catch (InterruptedException e) { 
          Thread.currentThread().interrupt(); 
          break; 
        } 
      } 

这工作的时间非常好99%,但偶尔,行我通过阅读BufferedReader.readLine不是一个完整的行。我想这是因为作家(网络服务器)尚未完成将该行的所有字节清除到文件。

任何修复或解决此问题的建议?非常感谢!

+0

你有一种模式来检测线路不完整? – VirtualTroll 2012-02-24 19:16:36

+0

只需一个快速指针:你不需要使用'while(true)... break',你可以使用一个变量来检查是否应该继续。 – Viruzzo 2012-02-24 19:18:02

+0

我认为这可能会对您有所帮助: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html#sync() – nullpotent 2012-02-24 19:19:16

回答

1

在与多个需要同时访问一个文件的多个进程一起工作(通常是一个进程一个接一个地进行)之后,我发现(与其他开发人员一起),一个“预告”文件很好地用于指示何时完成一个进程与需要被另一个进程访问的文件进行交互。

我不知道你的web服务器多久写一次这个日志,也不知道你的Java进程需要多久才能读取它,但是如果在每个进程访问文件之间有时间流逝,一个预告文件可能是写出来,表明当你的web服务器完成写入文件。你的Java进程可以首先检查尾部文件是否存在,然后找到它,删除然后从日志中读取。

否则,您可能需要使用操作系统命令来确定您的网络服务器是否正在写入日志,并且仅在日志读取器不在时才运行。 http://blog.bensmann.com/executing-operating-system-commands在Java中执行OS命令有一些很好的信息。

底线是需要建立某种固定的差距,以便这些过程不会同时读取/写入日志。

+0

谢谢扎克。网络服务器每秒写入速度非常快,几行代码和数据库数量都在增长。不知道检查网络服务器是否完成写入会花费很多。 我实际上并不介意读者稍微落后于作家,如果有帮助但不知道如何去做。 – 2012-02-24 22:54:51

-1

我最近面临同样的问题,让我解释一下bufferreader何时会用readline() 方法读取不完整的行。它会在回车前遇到EOF时执行此操作。

中的BufferedReader readine的代码是这样的

if (nextChar >= nChars) 
        fill(); 
       if (nextChar >= nChars) { /* EOF */ 
        if (s != null && s.length() > 0) 
         return s.toString(); 

        else 
         return null; 
       } 

这表示,如果前车遇到EOF返回它会返回不管它已经阅读。 但是,当我们调用readLine()并且在回车之前遇到EOF字符时,应该返回正确的代码,它应该返回NULL而不是不完整的行。

我写了我的扩展bufferedreader类,其中ReadLine在上面解释的场景中返回NULL。

+1

什么是“EOF字符”? – 2016-06-06 17:17:47

+0

您引用的代码中没有关于EOF字符的内容。没有EOF字符。有一个EOF *条件。* – EJP 2016-06-06 18:50:29

相关问题