首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows 10中监控大量文件和动态目录的最佳方式

在Windows 10中监控大量文件和动态目录的最佳方式
EN

Stack Overflow用户
提问于 2021-02-13 11:10:27
回答 1查看 143关注 0票数 0

我正在制作一个桌面应用程序,用于监视包含动态子目录和文件的目录。在这些子目录中创建了大量的文件(日志)。我想做一个应用程序来监视这些正在创建的文件(大约50个文件在5分钟内创建)通知。

我查看了java.nio提供的WatchDir,但由于我们需要为每个目录注册一个watchkey,所以我担心以后可能会遇到一些并发问题。

我试着寻找替代方案,我找到了Apache Commons的monitor,但根据这个answer,它占用了很多CPU。在我的例子中,我想监控大量的文件,但它们也不是连续的。我想在一天中只看几个小时的文件,在这段时间里会有很多文件生成。这里最好的选择是什么?

EN

回答 1

Stack Overflow用户

发布于 2021-02-13 12:00:11

如果您关心有多少线程在监视使用,可以很容易地编写一个小程序来检查:

代码语言:javascript
复制
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

public class Example {
    public static void main(String... args) throws IOException, InterruptedException {
        final WatchService watcher = FileSystems.getDefault().newWatchService();
        final int number_of_watches = 100;
        final Path[] paths = new Path[number_of_watches];
        final WatchKey[] watchKeys = new WatchKey[number_of_watches];
        final Path tmp = Files.createTempDirectory("watch");
        for (int i = 0; i < number_of_watches; i++) {
            paths[i] = tmp.resolve("dir" + i);
            Files.createDirectory(paths[i]);
            watchKeys[i] = paths[i].register(watcher,
                    ENTRY_CREATE,
                    ENTRY_DELETE,
                    ENTRY_MODIFY);
            System.out.println(paths[i]);
        }
        Thread.getAllStackTraces().keySet().stream().forEach(t -> System.out.println(t));
        
        for (;;) {
            WatchKey key = watcher.take();
            System.out.println("Change in " + key.watchable());
        }
    }
}

线程名部分的输出是:

代码语言:javascript
复制
Thread[Common-Cleaner,8,InnocuousThreadGroup]
Thread[main,5,main]
Thread[Finalizer,8,system]
Thread[FileSystemWatcher,5,main]
Thread[Signal Dispatcher,9,system]
Thread[Reference Handler,10,system]
Thread[Notification Thread,9,system]

所以这只使用了一个线程,即Thread[FileSystemWatcher,5,main]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66181513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档