我有一个模块,必须检查特定目录的新文件(创建)。该文件将由我没有控制权或可见性的另一个系统创建。
我使用了Java WatchService API,并且在创建新文件时能够获得事件ENTRY_CREATE。下面是代码。
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get(dirLocation);
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE);
WatchKey key;
while ((key = watchService.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
if ("ENTRY_CREATE".equalsIgnoreCase(event.kind().name())) {
// File reading here
}
问题是某个时候尝试读取新文件时,我得到的内容都是空的,没有任何异常。搜索Google和SO,我发现如果文件编写不完整,可能会发生这种情况。 为了解决这个问题,我尝试了随机访问文件,锁定并创建FileOutputStream,但是没有运气,我得到了没有任何异常的空内容。 最终,我在下面尝试了一下,并成功了。但我担心的是,必须在单独的线程中对此进行检查,以免阻塞WatchService事件,并且线程的数量会随着文件数量的增长而增长,这可能也是更昂贵的操作。
closed = file.renameTo(file);
还有其他有效的方法来检查文件写入操作是否完成吗?还是有可用的API可以处理此问题?