Java 获取WatchEvent证明存在的文件的FileNotFoundException
我正在编写一个程序,监视某个目录中的任何新文件,每当新文件到达时,该程序都会对这些文件执行一些操作。我使用WatchService来监视目录,所以我觉得可以确凿地证明该文件确实存在 但是,每当我尝试在WatchService找到的文件上创建FileReader时,我都会得到一个FileNotFoundException 我确信Java在尝试创建FileReader时使用的是绝对路径,所以我没有理由相信它看起来是在错误的地方 我对FileReader、FileNotFoundException以及File和Path对象做了大量研究,但我仍然无法确定引发此异常的原因 我对WatchService不太熟悉,但我使用了我在其他论坛上找到的代码,它似乎能够很好地检测到文件并将其传递出去。代码如下Java 获取WatchEvent证明存在的文件的FileNotFoundException,java,filereader,filenotfoundexception,watchservice,Java,Filereader,Filenotfoundexception,Watchservice,我正在编写一个程序,监视某个目录中的任何新文件,每当新文件到达时,该程序都会对这些文件执行一些操作。我使用WatchService来监视目录,所以我觉得可以确凿地证明该文件确实存在 但是,每当我尝试在WatchService找到的文件上创建FileReader时,我都会得到一个FileNotFoundException 我确信Java在尝试创建FileReader时使用的是绝对路径,所以我没有理由相信它看起来是在错误的地方 我对FileReader、FileNotFoundException以及
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()实际上没有为文件提供正确的路径,而是将其放在了错误的文件夹中。一