当前位置: 首页 > 知识库问答 >
问题:

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

段干高歌
2023-03-14

我正在编写一个程序来监视某个目录中的任何新文件,每当新文件到达时,程序都会对这些文件采取一些行动。我正在使用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
} 

如代码块中所述,一个java。io。FileNotFoundException是在我尝试基于文件创建FileReader后引发的。我知道该文件存在,因为我的WatchService检测到该文件正在创建,并为该文件的路径提供了触发器。上下文()。

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

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

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

非常感谢。

共有1个答案

云光明
2023-03-14

我知道该文件存在,因为我的WatchService检测到该文件正在创建,并为该文件的路径提供了触发器。上下文()。

不,没有。

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

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

此外,不要使用文件。一直使用路径。

确保事件是创建或修改后,使用文件打开文件的输入流或读取器。newInputStream()或文件。newBufferedReader()。如果使用这个,你仍然会得到一个异常,至少它比FileNotFoundException更有意义(阅读我上面发布的链接…)。

 类似资料:
  • 当我从图库中选择一个图像时,我可以获得该图像的Uri,如下所示: 上面检索到的Uri的格式是content://media/external/images/media/7266 但是,当我试图获取刚保存为文件的图像的Uri时,无法以这种格式检索Uri: 从上面的代码获得的Uri是/storage/emulated/0/dcim/camera/02-04-16 12-49-16.png 我相信,这不

  • 我正在使用jquery filepond image uploader插件,它将文件上传变成拖放区。 下面是初始化文件池的脚本 我计划在不使用ajax的情况下提交一个表单,它是一个dircect表单提交。 我只是想知道如何获取被拖放的文件名,以便将文件名值分配给另一个隐藏输入,这样我就可以通过form submit直接提交整个表单。 当文件被丢弃时,我已经将事件记录在console.log(“文件

  • 在Google Appengine中,是否可以从Google cloud storage文件路径中检索blob_key?文件直接上传到云存储。

  • 7.2.1 逻辑设备和文件 a) 逻辑设备 在Fortran中对文件和外部设备的操作都是通过逻辑设备进行的。在对文件和外部设备进行操作之前,都要把它们连接到逻辑设备上。内部文件的设备描述符和外部文件的设备描述符是不同的:内部文件用一个字符变量或其它变量名来描述,外部文件用OPEN语句打开文件时的数字(单元号)作为文件的描述,或是用默认的设备单元号包括星号(*)作为文件的描述。对于一个设备描述符,不

  • 我试图安装OpenShift Origin使用安西布尔playbook。 我有3个主机,3个外部ETCD主机。因此,在运行行动手册时,我得到了以下错误: 我在Ansible库存文件中设置了以下变量: 在主 上,提供以下信息: 据我了解,当我运行 Ansible 剧本时,这些 etcd 所需的证书压缩包正在导出到触发剧本的主机表单的 路径。由于我使用具有无密码sudo访问权限的其他用户运行Ansib

  • 我在我的应用程序中使用材料2,但在这个问题中,我想专门解决输入的问题。 正如您在API参考中看到的,有一个名为“required”的属性绑定,它在占位符中显示为星号。 因此,我想知道是否有方法检查表单控件在Angular中是否有特定的验证器,因为我真的不想为每个输入手动设置 我阅读了AbstractControl文档,但没有找到任何有关它的内容。我遇到了方法(具有讽刺意味的是,它在任何地方都没有记