簡體   English   中英

並行寫入和讀取文件

[英]parallel write and read from file

我想在我的系統中有一個中央日志文件,某個應用程序可以寫入和讀取該日志文件。 寫入用於新數據,讀取將生成的數據與寫入的數據進行比較。 我希望這個應用程序一次在多個實例中運行,這意味着我需要找到一種方法來從文件中讀取差異並寫入。 我看過這段代碼,但它對一次瀏覽文件很有用,但我沒有看到它在多個實例中工作。 我正在將此應用程序構建為命令行工具,因此我正在考慮為每個實例創建一個文件並將其遷移到“通用”日志文件。 我想聽聽論壇關於解決這個問題的不同方法的意見。 我擔心的是有幾個實例從同一個文件讀取和寫入並生成鎖。 這是我到目前為止找到的代碼:

public class Tp {
  public static void main(String[] args) throws IOException{
    File f = new File("/path/to/your/file/filename.txt");
    BufferedWriter bw = new BufferedWriter(new FileWriter(f));
    BufferedReader br = new BufferedReader(new  FileReader(f));
    bw.write("Some text");
    bw.flush();
    System.out.println(br.readLine());
    bw.write("Some more text");
    bw.flush();
    bw.close();
    br.close();
  }
}

您似乎不僅在一個程序中而且甚至在一個線程中嘗試寫入和讀取相同的文件。 我不認為這會有什么好處,因為在程序中你知道你什么時候/寫了什么,所以你可以擺脫整個 I/O 邏輯。

一開始嘗試編寫兩個不同的程序作為單獨的進程運行。 如果需要,您仍然可以嘗試將它們作為單獨的線程放入同一個 JVM 中。

寫肯定沒問題,所以比較有意思的部分是閱讀邏輯。 我可能會實現這個算法:

  • 循環直到程序終止...
    • 打開文件,使用skip()跳轉到有新數據的位置
    • 使用現有數據
    • 記住讀取了多少字節/記住文件大小
    • 關閉文件
    • 等到文件更改

等待文件更改可以通過監視File.lastModifiedFile.length或使用WatchService來完成。

但請注意,如果您有多個應用程序並行寫入同一個文件,它可能會破壞數據中任何有意義的結構。 Log4j 確保來自一個應用程序/多個線程的並行寫入將正確地寫入文件。 如果您需要多個進程運行同步寫入,請考慮登錄數據庫。

暫無
暫無

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

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