我正在编写一个程序,该程序监视某个目录中的任何新文件,每当新文件到达时,程序都会对这些文件执行一些操作。我正在使用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()
打开文件的InputStream
或Reader
。如果使用它,你仍然得到一个例外,至少它会比FileNotFoundException
更有意义(阅读我上面发布的链接......