为 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()
打开文件的 InputStream
或 Reader
。如果使用这个,你仍然得到一个异常,至少它会比 FileNotFoundException
更有意义(阅读我上面发布的 link...)。
我正在编写一个程序来监视某个目录中是否有任何新文件,每当有新文件到达时,该程序就会对这些文件采取一些措施。我正在使用 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()
打开文件的 InputStream
或 Reader
。如果使用这个,你仍然得到一个异常,至少它会比 FileNotFoundException
更有意义(阅读我上面发布的 link...)。