簡體   English   中英

我如何在一個Java進程中創建和寫入文件並從另一個進程中讀取而不會遇到讀/寫問題(Java / EE)

[英]How can I create and write a File one Java Process and read from another process without facing read/write problems(Java/EE)

我的情況

我有一個處理FTP的進程,另一個處理電子郵件的進程。

當我完成FTP后,我想通過電子郵件發送成功通知。 因此,電子郵件進程正在監視新文件pr配置文件是否進入特定目錄

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

我面臨的問題是在創建文件並將其寫入時。 電子郵件過程,它將檢測新文件並在寫入文件之前或期間讀取該文件。 因此,它僅訪問空參數。 雖然我可以在“電子郵件”過程中處於休眠狀態,但它並非在所有情況下都有效,並且會妨礙其他完成文件的人。

我該如何使用-創建一個屬性文件,直到完全寫完該文件才能讀取該文件-或創建一個帶有鎖的屬性文件,如果需要,該鎖可以從另一個進程中解鎖。

我有什么選擇?

到目前為止:-我已經嘗試使用apache commons配置來setProperty,它創建了相同的舊讀/寫訪問問題-我創建了一個屬性= new屬性,並使用store方法創建了文件。 即使這樣,電子郵件過程仍會在完全閱讀之前閱讀

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

您需要對文件系統執行“原子”操作。 將文件寫入另一個文件名(例如.tmpfoobar)下,完成后,將其關閉並執行File.renameTo()將其移動到位。 重命名是原子的。

不知道為什么您會被否決,因為這似乎是一個值得回答的問題。

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

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

此頁面以及javamex.com上的其他頁面對Java並發編程有一些很好的解釋:

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

暫無
暫無

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

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