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

Java 获取WatchEvent证明存在的文件的FileNotFoundException,java,filereader,filenotfoundexception,watchservice,Java,Filereader,Filenotfoundexception,Watchservice,我正在编写一个程序,监视某个目录中的任何新文件,每当新文件到达时,该程序都会对这些文件执行一些操作。我使用WatchService来监视目录,所以我觉得可以确凿地证明该文件确实存在 但是,每当我尝试在WatchService找到的文件上创建FileReader时,我都会得到一个FileNotFoundException 我确信Java在尝试创建FileReader时使用的是绝对路径,所以我没有理由相信它看起来是在错误的地方 我对FileReader、FileNotFoundException以及

我正在编写一个程序,监视某个目录中的任何新文件,每当新文件到达时,该程序都会对这些文件执行一些操作。我使用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
} 
试试看
{
WatchService watcher=FileSystems.getDefault().newWatchService();
Path dir=Path.get(“C:\\sample\\Path”)
WatchKey key=dir.register(观察者,条目创建);
对于(;;)
{
尝试
{
key=watcher.take();
}
捕获(中断异常异常)
{
//代码
}
最后
{
for(WatchEvent事件:key.pollEvents())
{
WatchEvent.Kind-Kind=event.Kind();
如果(种类==溢出)
{
继续;
}
WatchEvent触发器=(WatchEvent)事件;
路径文件名=trigger.context();
filename=filename.toabsolutionPath();
File theFile=filename.toFile();
//这里抛出异常
FileReader fReader=新文件读取器(文件);
/**
*更多代码
**/
}
}
}
}
捕获(IOException异常)
{
//代码
} 
如代码块中所述,在我尝试基于该文件创建文件读取器后,会引发java.io.FileNotFoundException。我知道该文件存在,因为我的WatchService检测到正在创建该文件,并使用trigger.context()提供了该文件的路径

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

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

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

多谢各位

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

没有

您未能查询事件的类型。JDK提供了,但您只检查是否存在溢出

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

更重要的是。始终使用路径


确保事件是创建或修改后,使用或打开文件的
InputStream
Reader
。如果使用此方法,您仍然会得到一个异常,至少它比
FileNotFoundException
(阅读我在上面发布的链接…)更有意义。

您是否尝试在
新文件阅读器(文件)上设置断点Path
时,为什么要使用
File
??这就像在您有carI时使用牛车一样,我确信该文件存在于该目录中,因为作为测试的一部分,我将物理地将文件放入该目录中,以便处理WatchService以创建WatchEvent。但是我刚才还在代码行添加了一个断点,在代码行执行之前,文件仍然存在于目录中。为了回答您的问题,我使用了
File
而不是
Path
,因为据我所知,
FileReader
没有构造函数接受
Path
参数。只有
字符串
文件
文件描述符
。您可以在
新文件读取器(…)
之前添加
if(thefile.exists())
,看看它是否解析为true,也可以尝试
新文件读取器(thefile.getAbsoluteFile())
谢谢您的回复。我对WatchService的理解是,使用这一行
WatchKey=dir.register(watcher,ENTRY\u CREATE)
my Watch服务仅监视
CREATE
OVERFLOW
。更重要的是,我在
WatchEvent.Kind=event.Kind()之后直接添加了一条调试语句
println
这种类型,在我的每一次测试中,它都是
CREATE
。感谢您对
路径
vs
文件
的建议。我现在使用
Files.newbufferederder(Path)
而不是
newfilereader(theFile)
,我得到了一个
java.nio.file.NoSuchFileException
。你能在你的程序中打印“dir”和“theFile”的值吗。当我运行你的代码时。我对他们两个都有不同的评价。调试后,我将Path dir值更改为我为该文件获得的值,它可以正常工作。正如fge建议的那样,我将entry_create改为StandardWatchEventKinds.entry_create.噢,哇,太神奇了,现在我觉得自己很愚蠢。没错,dir的值和文件的路径不匹配。出于某种原因,toabsolutionPath()实际上没有为文件提供正确的路径,而是将其放在了错误的文件夹中。一