2011-07-08 27 views
2

我實現JNotify確定何時一個新的文件到達一個特定的目錄,並且,當文件到達,到送過來的文件名到另一個功能,如下所示:JNotify和文件閱讀器衝突的對方

public class FileDetector { 
      MessageProcessor mp; 
      class Listener implements JNotifyListener { 
        public void fileCreated(int wd, String rootPath, String name) { 
          print("created " + rootPath + " : " + name); 
          mp.processMessage(rootPath + "\\" + name); 
        } 
      } 
    } 

函數mp.processMessage嘗試打開文件,但我一直收到錯誤消息,說明該文件正在被另一個進程使用。但是,由於該文件剛剛創建,所以可能使用它的唯一其他進程是JNotify。

我放了幾個打印語句,看起來函數mp.processMessage在偵聽器的打印函數之前被調用。除了將整個消息處理放在監聽器類中之外,有沒有人有建議可以解決這個問題?

+0

什麼操作系統和文件系統是在創建文件?該文件是否由另一個進程創建?其他進程是否創建該文件,然後打開它以便寫入? – Bringer128

+0

Windows。我只是將文件複製到目錄中,或者使用FTP將文件移動到那裏。 – Elie

回答

1

@Eile我認爲只要一個進程正在複製文件,您正在嘗試讀取它,100毫秒的延遲將首先完成複製,然後您可以輕鬆讀取該文件。

0

這是我迄今爲止所做的 - 在嘗試打開文件之前,我在mp.processMessage()之前延長了100毫秒,並且沒有任何問題。然而,我仍然不明白爲什麼這是必要的,以及這個問題是否有更好的解決方案。

0

我試過這個,發現一個任意的延遲對我來說效果不好。我所做的是創建一個DelayQueue。我將每個觀察到的新文件以100ms的延遲添加到隊列中。當延遲過期時,我檢查文件是否可讀/可寫。如果是,我將它從隊列中彈出。如果沒有,我再讀100毫秒延遲隊列。要檢查它是否可讀/可寫,我嘗試打開FileInputStream到文件。如果沒有例外,我關閉流並彈出文件。

我希望nio.2(jsr 203)沒有這個相同的問題。如果你可以使用Java 7,你可能想嘗試一下。