2010-12-03 59 views
1

我的情況如何創建並寫入文件一個Java進程,並沒有遇到讀/寫問題(的Java/EE)

我有一個過程,做FTP和其他進程哪些電子郵件從另一個進程讀取。

雖然我完成了FTP,但我想通過電子郵件發送成功通知。 因此,電子郵件進程正在監視一個新的文件pr配置文件來進入一個特定的目錄

FTP進程創建一個適合於電子郵件進程的文件,這是一個屬性文件中的電子郵件列表或多或少的列表。

我面臨的問題是當我創建文件並寫入它。在寫入文件之前或期間檢測新文件並讀取它的電子郵件進程。因此它只訪問空參數。雖然我可以在電子郵件過程中安排睡眠,但它不適用於所有情況,並且會妨礙已完成文件的其他人。

我可以用它來 - 創建什麼不能被讀取,直到一個屬性文件被完全寫入 -or創建可以從另一個進程解鎖如果需要鎖定的屬性文件。

我的選擇是什麼?

至於現在: - 我一直在使用Apache的百科全書配置的SetProperty它創造同樣的老讀/寫訪問的問題 嘗試 - 我創建了一個屬性=新的屬性和使用的存儲方法來創建文件。即使這樣,電子郵件過程將在完全讀取之前讀取

僅供參考:電子郵件過程具有WatchDirectory,並在每次創建新文件時讀取。

回答

5

您需要對文件系統執行「原子」操作。將文件寫入另一個文件名(例如.tmpfoobar)中,當完成時,關閉它並執行File.renameTo()將其移至原位。重命名是原子的。

0

不知道你爲什麼被低估,因爲這似乎是一個有價值的問題。

Martin建議使用文件重命名來完成此操作:首先用臨時名稱寫入文件,然後重命名它。然後,如果其他進程/線程只訪問重命名的文件,那麼你應該很好,因爲重命名確實是原子的。

如果您正在使用多線程應用程序,另一種方法是使用某種類型的互斥鎖,以確保讀取線程在寫入線程關閉文件之前不會讀取。

本頁面和其他人javamex.com了Java併發編程的一些很好的解釋:

http://www.javamex.com/tutorials/synchronization_concurrency_1.shtml

+0

可能已經下降評選爲文件並不是進程間通信的好辦法。我假設OP知道這一點,並試圖找到最好的解決方案,因爲他有限制。 – 2010-12-03 23:45:03

相關問題