为 WatchEvent 证明存在的文件获取 FileNotFoundException

Getting FileNotFoundException for a file that is proven to exist by WatchEvent

我正在编写一个程序来监视某个目录中是否有任何新文件,每当有新文件到达时,该程序就会对这些文件采取一些措施。我正在使用 WatchService 监视目录,所以我觉得可以最终证明该文件确实存在。

但是,每当我尝试在 WatchService 找到的文件上创建 FileReader 时,我都会收到 FileNotFoundException。

我正在确保 Java 在尝试创建 FileReader 时使用的是绝对路径,所以我没有理由相信它找错了地方。

我对 FileReader、FileNotFoundException 以及 File 和 Path 对象进行了大量研究,但我仍然无法确定抛出此异常的原因。

我不太熟悉 WatchService,但我使用了我在其他论坛上找到的代码,它似乎可以很好地检测文件并通过它。代码如下。

try
{
  WatchService watcher = FileSystems.getDefault().newWatchService();
  Path dir = Paths.get("C:\sample\path")
  WatchKey key = dir.register(watcher, ENTRY_CREATE);  
  for(;;) 
  {
    try
    {
      key = watcher.take();
    }
    catch(InterruptedException exception)
    {
      //code
    }
    finally
    {
      for(WatchEvent<?> event: key.pollEvents())
      {
        WatchEvent.Kind<?> kind = event.kind();

        if (kind == OVERFLOW)
        {
          continue;
        }

        WatchEvent<Path> trigger = (WatchEvent<Path>)event;
        Path filename = trigger.context();
        filename = filename.toAbsolutePath();
        File theFile = filename.toFile();
        //EXCEPTION IS THROWN HERE
        FileReader fReader = new FileReader(theFile);
        /**
        *  more code
        **/
      }
    }
  }
}
catch(IOException exception)
{
  //code
} 

如代码块中所述,在我尝试基于文件创建 FileReader 后抛出 java.io.FileNotFoundException。我知道该文件存在,因为我的 WatchService 检测到正在创建的文件并使用 trigger.context() 提供了文件路径。

我什至通过在文件上调用 toAbsolutePath() 来确保 FileReader 使用文件的绝对路径。

我在有问题的代码行之前有一个调试语句,打印有问题的文件的路径,是的,打印的路径是文件的正确绝对路径。那么为什么 FileReader 检测不到文件呢?

我希望有人能帮助我,我意识到这个 post 非常长,但我不确定问题是由我的 WatchService、File 还是 FileReader 引起的,所以我想包含尽可能多的信息。

非常感谢。

I know that the file exists because my WatchService detected the file being created and provided the file's path with trigger.context().

不,它没有。

您查询事件的类型失败。 JDK提供these standard types,你只检查是否溢出。

您必须检查收到的事件实际上是修改还是创建(即 StandardWatchEventKind.EVENT_{CREATE,MODIFY})。

更重要的是,don't use File。一路使用Path

一旦您确定事件是创建或修改,然后使用 Files.newInputStream() or Files.newBufferedReader() 打开文件的 InputStreamReader。如果使用这个,你仍然得到一个异常,至少它会比 FileNotFoundException 更有意义(阅读我上面发布的 link...)。