获取 FileNotFoundException 对于被 WatchEvent 证明存在的文件



我正在编写一个程序,该程序监视某个目录中的任何新文件,每当新文件到达时,程序都会对这些文件执行一些操作。我正在使用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。我知道该文件存在,因为我的监视服务检测到正在创建的文件,并使用 trigger.context() 提供了文件的路径。

我甚至通过对文件调用 AbsolutePath() 来确保 FileReader 使用文件的绝对路径。

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

我希望有人可以帮助我,我意识到这篇文章特别长,但我不确定问题是由我的监视服务、文件还是文件阅读器引起的,所以我想包含尽可能多的信息。

谢谢。

我知道该文件存在,因为我的监视服务检测到正在创建的文件,并使用 trigger.context() 提供了文件的路径。

不,它没有。

无法查询事件的类型。JDK 提供了这些标准类型,但您只检查是否存在溢出。

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

更重要的是,不要使用File.一直使用Path

确保事件是创建或修改后,请使用 Files.newInputStream()Files.newBufferedReader() 打开文件的InputStreamReader。如果使用它,你仍然得到一个例外,至少它会比FileNotFoundException更有意义(阅读我上面发布的链接......

相关内容

  • 没有找到相关文章

最新更新