2010-07-08 53 views
4

在同一個應用程序中的兩個「writer」服務之間共享文件的最佳方式是什麼?跨服務鎖定文件

編輯: 對不起,我應該給我更多的細節,我猜。

我有一個服務,將條目保存到緩衝區。當緩衝區滿時,它將所有條目寫入文件(依此類推)。另一個服務正在運行,讀取文件(實質上是複製/壓縮),然後將其清空。

+0

我已經更新了我的答案......讓我知道它是否符合您的要求。 – Kiril 2010-07-08 16:44:22

回答

2

這裏是你可以做什麼總體思路:

public class FileManager 
{ 
    private final FileWriter writer = new FileWriter("SomeFile.txt"); 
    private final object sync = new object(); 

    public void writeBuffer(string buffer) 
    { 
     synchronized(sync) 
     { 
      writer.write(buffer.getBytes()); 
     } 
    }   

    public void copyAndCompress() 
    { 
     synchronized(sync) 
     { 
      // copy and/or compress 
     } 
    } 

} 

你將不得不做一些額外的工作,把一切工作的安全,但是這僅僅是一個基本的例子給你一個想法它的外觀。

+0

謝謝,但我不認爲這是我正在尋找。我會更新第一篇文章以提供更多詳細信息。對不起:) – charisk 2010-07-08 16:36:26

+0

@roul,好的,我根據你的澄清更新了答案。 – Kiril 2010-07-08 16:45:05

+0

我想要避免這樣的事情是誠實的:)但我現在無法想到其他任何東西。在我的情況下,因爲我有android服務,對象鎖和方法應該是靜態的,服務會調用FileManager。 – charisk 2010-07-08 16:51:50

0

一種常見的鎖定方法是在主文件的相同位置創建第二個文件。第二個文件可能包含鎖定數據或爲空白。鎖定數據(如進程ID)的好處是您可以輕鬆檢測到過時的鎖文件,這是您必須計劃的必然性。雖然PID可能不是您的案例中最好的鎖定數據。

例如: 服務1:

  • 創建myfile.lock
  • 創建/打開myfile

服務2:

  • 注意到myfile.lock存在並且暫停/塊/等待
  • myfile.lock消失時,它會創建它,然後打開myfile。

對於您在創建它之後再次檢查文件是否包含您的鎖定信息(特定於您的服務的標識)也是有利的 - 以防萬一兩個或更多服務正在等待並創建一個鎖完全相同的時間。最後一個成功,所有其他服務應該注意到他們的鎖定數據不再在文件中。另外 - 在檢查其內容之前暫停幾毫秒。

+0

有趣的解決方案,但我不明白我可以如何使用它在我的情況。不管怎麼說,還是要謝謝你。 – charisk 2010-07-09 10:25:42

+0

我明白了。我的解決方案適用於多個應用程序,但我看到您正在同步應用程序中的進程。我很困惑,因爲你稱他們爲「服務」。我同意接受的答案 - 「synchronized」關鍵字適合您的情況。 – 2010-07-09 16:57:35