慕尼黑5688855
2021-09-15 11:01:03
我正在編寫一個應用程序,它將掃描新添加的文件的目錄,然后使用 WatchService 對它們進行一些處理。這部分按預期工作?,F在,我需要編寫代碼來處理在服務啟動之前添加到目錄中的文件。最簡單的方法是在向 WatchService 注冊路徑之前簡單地獲取文件夾中的文件列表;但是,我擔心這可能會在處理預先存在的文件和觀察新事件之間留下間隙,我可能會錯過傳入的文件。最安全的選擇是開始監視事件,但不處理它們,直到我處理了已經存在的文件。有什么方法可以手動將 WatchKey 的狀態更改為“已發出信號”?這將實現我的目標,但我在 WatchService 的文檔中沒有看到這樣做的方法。
1 回答

吃雞游戲
TA貢獻1829條經驗 獲得超7個贊
最簡單的方法是在向 WatchService 注冊路徑之前簡單地獲取文件夾中的文件列表;但是,我擔心這可能會在處理預先存在的文件和觀察新事件之間留下間隙,我可能會錯過傳入的文件。最安全的選擇是開始監視事件,但不處理它們,直到我處理了已經存在的文件。
以下是解決問題的方法:
同時啟動watch-service
和get-files-list-from-folder-process
。
這兩個進程都將文件(文件路徑)放入線程安全隊列集合中 - 首先 - 這允許后進先出 (LIFO) 或先進先出 (FIFO) 處理。可以考慮java.util.concurrent.ConcurrentLinkedDeque
、LinkedBlockingDeque
、ConcurrentLinkedQueue
或LinkedBlockingQueue
基于要求。這樣,所有文件都會一個接一個地處理 - 無論它來自 get-files-list-from-folder-process 還是 watch-service。
但是,需要進行檢查以避免重復文件處理以確保沒有文件兩次添加到隊列中。這僅在應用程序開始時需要。實際的文件處理程序本身可以跟蹤在另一個集合中處理的文件 - 可用于檢查文件是否已被處理。
添加回答
舉報
0/150
提交
取消