簡體   English   中英

Java:在復制內容之前先通知WatchService

[英]Java: WatchService gets informed before content is copied

我試圖將很小的文件復制並粘貼到監視服務觀察到的文件夾中。 第一次效果很好,但是在執行以下所有復制和粘貼操作時,我遇到了一個例外,即另一個進程已經處理了該文件。 通過實驗,我發現Windows創建文件時通知我的服務,而不是復制內容時通知我。 如果我鎖定文件,則Windows無法復制任何數據,並且文件為空。 另一方面,如果將文件移到目錄中,則一切正常。

這是Windows的錯誤嗎? 我無法在Mac或Linux工作站上對其進行測試。 也許只是我無能為力。 任何幫助表示贊賞。

我的代碼如下所示:

try (WatchService watchService = importPath.getFileSystem().newWatchService()) {
  importPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
  handleExistingFiles();

  try {
    do {
      WatchKey watchKey = watchService.take();
      if (!watchKey.isValid()) {
        continue;
      }

      boolean hasCreationEvents = false;
      for (WatchEvent<?> event : watchKey.pollEvents()) {
        hasCreationEvents |= event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE);
      }
      watchKey.reset();

      if (hasCreationEvents) {
        handleNewFiles();
      }
    }
    while (!Thread.currentThread().isInterrupted());
  }
  catch (InterruptedException ignoredEx) {
    Thread.currentThread().interrupt();
  }
}

復制操作並不總是原子的。

使用原子復制(或移動),您將獲得一個ENTRY_CREATE事件,該事件引用的文件將是完整的並可讀取。

如果副本不是原子副本,則在創建文件時將收到ENTRY_CREATE事件,然后在通過復制操作寫入文件時將收到一個或多個ENTRY_MODIFY事件。

沒有簡單的方法來確定復制操作何時完成寫入文件並釋放它。 根據操作系統和文件系統的不同,在通過復制操作鎖定文件時嘗試打開文件進行讀取時,可能會收到FileNotFoundException異常,或者可以成功打開文件,但實際讀取文件時會得到部分內容。

您將必須實施一些試探法,例如嘗試在ENTRY_CREATE之后立即讀取文件,並在初始讀取失敗時將讀取重新安排在以后的時間。

暫無
暫無

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

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