当前位置: 首页 > 面试题库 >

Java:在复制内容之前通知WatchService

吴浩皛
2023-03-14
问题内容

我试图将很小的文件复制并粘贴到监视服务观察到的文件夹中。第一次效果很好,但是在执行以下所有复制和粘贴操作时,我遇到了一个例外,即另一个进程已经处理了该文件。通过实验,我发现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之后立即读取文件,并在初始读取失败时将读取重新安排在以后的时间。



 类似资料:
  • 通知通道的新代码在旧的和最新的奥利奥设备上运行良好,但当我在API 28(android P)设备上测试时,它没有在通知栏中显示通知,这是我用来启动前台通知的行。

  • 我试图在Tripadvisor中收集多家酒店的评论,我能够收集150个观察数据,其中包括来自30家酒店的150个评论数据。 但是,当我尝试添加hotel_name的新列并执行爬网时,hotel name不会再次出现,观察次数会减少到hotel的数量,即30。如何将酒店名称复制到每个审阅行? 这是我正在使用的代码:

  • 假设我有一个Android应用程序,它使用从随机REST API获取的内容构建一个ListView。 想象一下,现在我需要在API上有新内容可用时发送推送通知。最简单的方法是什么? 对于Android上的推送通知流程,我有点摸不着头脑。我看了一下Firebase,但我不知道我是否需要在Firebase上建立一个数据库,在API提供新内容时存储结果,然后在数据库更新时触发通知,或者我不需要数据库等等

  • 问题内容: 我知道您可以使用将文件从主机复制到正在运行的Docker容器,但就我而言,我想在启动Docker容器之前将其复制。我怎样才能做到这一点? 请注意,我不想在构建的docker映像中使用此文件,因此即使在构建时也无法复制该文件。另一种方法是使用已安装的卷(带有),但我也不希望这样。 问题答案: 您可以执行以下操作:

  • 问题内容: 在Firefox 3和Google Chrome 8.0中,以下功能可以正常运行: 但是当元素为时不是这样: 为什么它不按我的预期工作? 问题答案: 使用和指定要在该元素内部 的内容 之前(或之后)插入 的内容 。元素没有内容。 例如,如果你写的(这是错误的),浏览器会纠正这一点,并把文字 后 输入元素。 您唯一可以做的就是将每个输入元素包装在span或div中,并在这些元素上应用CS