Java 在行完成之前,BufferedReader读取行

Java 在行完成之前,BufferedReader读取行,java,io,readline,bufferedreader,Java,Io,Readline,Bufferedreader,我有一个进程(实际上是一个Web服务器),它将从客户端传入的帖子写入日志文件 然后我有一个单独的进程,在循环中读取日志文件,如(tail-f): BufferedReader reader = new BufferedReader(new FileReader(logFilePath)); String line = null; while (true) {

我有一个进程(实际上是一个Web服务器),它将从客户端传入的帖子写入日志文件

然后我有一个单独的进程,在循环中读取日志文件,如(tail-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中读到的那一行并不是完整的一行。我想这是因为编写器(Web服务器)还没有将行中的所有字节刷新到文件中


有没有解决这个问题的建议?非常感谢

处理过多个需要同时访问一个文件的进程(通常是一个进程接着一个进程),我发现(与我合作过的其他开发人员一起)一个“拖车”文件可以用来指示一个进程何时完成与另一个进程需要访问的文件的交互

我不确定您的Web服务器写入此日志的频率以及Java进程读取日志的速度,但如果每个进程访问该文件之间有时间间隔,则可以写出一个尾部文件,指示您的Web服务器何时完成写入该文件。您的Java进程可以首先检查拖车文件是否存在,然后在找到它后,删除并从日志中读取

否则,您可能需要使用OS命令来确定您的Web服务器是否正在写入日志,并且只在日志读取器未写入时运行日志读取器。有一些关于在Java中执行OS命令的好信息


归根结底,需要建立某种类型的可靠间隙,以使这些进程不会同时读取/写入日志。

我最近遇到了同样的问题,让我解释一下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。

当行未完成时,您是否有一个模式可以检测?只是一个快速指针:您不需要使用
while(true)。。。打断
,您可以使用一个变量来检查是否应该继续。我认为这可能会对您有所帮助:Amine,是的,每一行都是json。因此,当它不完整时,它是无效的json。但是readLine的下一个调用将是下一行,而不是整行。谢谢Zack。Web服务器写得非常快,每秒有几行代码和kB,而且还在增长。不确定检查Web服务器是否完成了编写是否会很昂贵。实际上,我并不介意读者稍微落后于作者,如果这有帮助的话,但不知道如何做到。什么是“EOF字符”?你引用的代码中没有关于EOF字符的内容。没有EOF字符。存在EOF条件。