在Windows上监视目录以查找新文件

时间:2018-07-31 10:25:34

标签: java java-7 java-threads watchservice

我有一个模块,必须检查特定目录的新文件(创建)。该文件将由我没有控制权或可见性的另一个系统创建。
我使用了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可以处理此问题?

0 个答案:

没有答案