簡體   English   中英

從Java中不斷更新的文件中讀取新數據

[英]Reading new data from a constantly updating file in Java

我有一個日志文件,該文件會不斷更新以新的數據行。 我需要在Java寫入后立即獲取新添加的數據。 現在,我的解決方案是:

public static void readNonStop(String filename, boolean goToEnd, FileReadCallback readCallback) {
    if(readCallback == null) {
        return;
    }
    try {
        BufferedReader br = new BufferedReader(new FileReader(filename));
        try {
            String line = br.readLine();
            int lineNumber = 0;

            if(goToEnd) {
                while(br.readLine() != null) {}
            }

            while (true) {
                if(line != null) {
                    readCallback.onRead(lineNumber++, line);
                } else {
                    Thread.sleep(1);
                }
                line = br.readLine();
            }
        } finally {
            br.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

但是我有一種感覺,應該有更好的方法。 我不喜歡內部帶有“睡眠”的恆定運行循環的想法,而是更喜歡某種事件驅動的方法。

如果每次文件修改時我都依靠FileSystem事件重新打開文件,則會產生延遲。

在這種情況下,正確的做法是什么?

提前致謝!

文件並非旨在作為消息傳遞解決方案。 即使使用基於環回的TCP,也會有10到30微秒的延遲。 在不更改文件格式的情況下,您的解決方案可能是最快的。

注意:您不必睡一整毫秒。 您可以使用Thread.yield()LockSupport.parkNanos(100_000); 對於更復雜的策略,您可以使用LongPauser之類的類, 該類以可配置的方式退出。

順便說一句,我實現了一種名為Chronicle Queue的解決方案,以低延遲方式寫入/讀取文件。 使用二進制格式來提高速度時具有亞微秒級的延遲。

注意:您可以通過將所有文件打開為FileInputStream時跳過所有available()字節來結束操作。 這可能會導致行不完整,具體取決於緩沖的工作方式。

暫無
暫無

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

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