gpt4 book ai didi

java - 观看大量目录的最佳方式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:39 25 4
gpt4 key购买 nike

我写了一个music player in Java/JavaFX它(除其他事项外)监视用户的音乐库文件夹是否有任何更改,并在文件系统发生更改时更新程序的库数据。

我用 SimpleFileVisitor 完成了这个和一个 WatchService . SimpleFileVisitor 递归遍历目标文件夹层次结构,并向 WatchService 注册每个文件夹。完整代码如下。

在我的 Ubuntu 18.04 上,如果我尝试以这种方式注册许多文件夹,每个文件夹都有很多子文件夹,我最终会收到错误 java.io.IOException: User limit of inotify watches reached.

原来Linux内核在文件/proc/sys/fs/inotify/max_user_watches中限制了可以完成的inotify watch的数量。常见的默认值为 8192。此限制适用于用户运行的每个程序,还有其他使用很多的流行程序,如 DropBox。

我的图书馆也可能需要很多。对于可能使用此程序的用户,1000 - 25000 个想要观看的文件夹是一个合理的估计。我希望大多数用户都在 2000 - 5000 范围内。

一个解决方案是通知用户错误并告诉他们增加内核中的 max_user_watches 数量,这是可以做到的,但我不喜欢把这个负担放在用户身上,如果这是可以避免的。

有没有另一种好方法可以在 java 中通知文件夹层次结构的更改,而不会在 Linux 上重载 inotify 编号?

我的完整观察者代码可以在这里找到,从第 545 行开始:https://github.com/JoshuaD84/HypnosMusicPlayer/blob/55da2819a3862d5c2a14797a9ce45e9171f7076e/src/net/joshuad/hypnos/Library.java#L545

您还可以在此处查看主要的 walker 代码:

private void watcherRegisterAll ( final Path start ) {
try {
Files.walkFileTree(
start,
EnumSet.of( FileVisitOption.FOLLOW_LINKS ),
Integer.MAX_VALUE,
new SimpleFileVisitor <Path>() {
@Override
public FileVisitResult preVisitDirectory ( Path dir, BasicFileAttributes attrs ) throws IOException {
WatchKey key = dir.register(
watcher,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY
);

keys.put( key, dir );
return FileVisitResult.CONTINUE;
}
}
);

} catch ( IOException e ) {
LOGGER.log( Level.INFO, "Unable to watch directory for changes: " + start.toString() );
}
}

最佳答案

您的方法是正确的,inotify 是执行此操作的最高效方法。如果您遇到此问题,您可以提示用户代表他们增加限制以提供更好的用户体验(您必须为此要求密码来执行权限升级)。

关于java - 观看大量目录的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53359456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com