簡體   English   中英

行完成前的BufferedReader readLine

[英]BufferedReader readLine before the line is complete

我有一個過程(實際上是一個Web服務器),它作為來自客戶端的POST寫入日志文件。

然后,我有一個單獨的進程在循環中讀取日志文件,例如(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服務器)尚未完成將行的所有字節刷新到文件中。

有任何解決或解決此問題的建議嗎? 非常感謝!

與需要大約同時訪問一個文件的多個進程(通常一個接一個的進程)一起工作后,我發現(以及與我合作的其他開發人員一起)“ trailer”文件很好用以指示一個進程何時與需要由另一個進程訪問的文件進行交互。

我不確定您的網絡服務器寫入該日志的頻率以及您的Java進程需要多長時間讀取一次,但是如果每個進程對文件的訪問之間有間隔時間,則可以寫出預告文件來表明當您的網絡服務器寫完文件時。 您的Java進程可以首先檢查預告文件是否存在,然后在找到預告文件后將其刪除,然后從日志中讀取。

否則,您可能需要使用OS命令來確定您的Web服務器是否正在寫入日志,並且僅在不運行時才運行日志讀取器。 http://blog.bensmann.com/executing-operating-system-commands提供了一些有關在Java中執行OS命令的信息。

最重要的是,需要建立某種牢固的間隙,以使這些進程不會同時讀取/寫入日志。

我最近遇到了同樣的問題,讓我解釋一下何時使用readline()方法將bufferreader讀取不完整的行。 當在回車之前遇到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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM