gpt4 book ai didi

java - 为什么使用 WatchService 检测文件更改会出现延迟? ( java )

转载 作者:行者123 更新时间:2023-11-30 06:27:21 29 4
gpt4 key购买 nike

我有一个应用程序,当一个文件被添加到目录时,WatchService 检测到该文件并将该文件添加到文件列表以供进一步处理。这是我的代码

 public void run() {

/*
* Goes in an infinite loop
*/
while(!finished) {

/*
* Get a watch key, poll() returns a queued key
* if no queued key, this method waits until the specified time.
*/
WatchKey key;
try {
key = watcher.poll(eofDelay,TimeUnit.MILLISECONDS);
} catch (InterruptedException x) {
return;
}

Path dir = keys.get(key);

if (dir == null) {
continue;
}

Path child=null;

/*
* Fetching the list of watch events from
* pollEvents(). There are four possible events
*/

for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind kind = event.kind();

/*
* Overflow indicates that events
* might have been lost or discarded
*/
if (kind == OVERFLOW) {
continue;
}


WatchEvent<Path> ev = cast(event);

/*
* Filename is the context of the event
*/
Path name = ev.context();

/*
* Resolves the name of the file to a path
*/
child = dir.resolve(name);

/*
* If directory is created, and watching recursively, then
* register it and its sub-directories
*/
if (nested && (kind == ENTRY_CREATE)) {
try {
if (Files.isDirectory(child, NOFOLLOW_LINKS)) {
registerAll(child);
}
} catch (IOException x) {

}
}
}

File file = child.toFile();

/*
* Only add the file if there is no wild card
* or it matches the specified wild card
*/
if (matcher == null || matcher.matches(file.toPath().getFileName())) {
fileList.add(file);
}
/*
* Key is reset so that it can receive further
* events
*/

boolean valid = key.reset();
if (!valid) {
keys.remove(key);

/*
* If key is no longer valid and empty,
* exit the loop
*/
if (keys.isEmpty()) {
continue;
}
}

}
}

此代码按预期工作,但我正在设计一个高性能应用程序,它以非常高的速度处理文件中的数据。所以这里的问题是检测文件所花费的时间不一致。例如,最初目录中有一些文件,它们由应用程序处理,现在当添加新文件时,需要 4-5 秒才能检测到该文件,有时需要 2 秒或 20 毫秒等等。我的 eofDelay 值为 10ms。这种不一致的原因是什么?有没有办法加强这个实现?或者任何其他可用于目录更改的有效库?我希望检测文件所花费的时间最少且一致,超过一秒钟的时间是非常昂贵的。在这方面的任何帮助将不胜感激。 :)

最佳答案

您可以通过向文件夹添加敏感度标志来更快地获得结果(见下文)。

// copied from http://stackoverflow.com/questions/9588737/is-java-7-watchservice-slow-for-anyone-else
folder.register(watcher, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY}, SensitivityWatchEventModifier.HIGH);

但是,您仍然会受到底层操作系统的摆布。我见过的大多数文件监视应用程序在添加文件和提取文件之间都有几秒钟的延迟。您在应用程序中看到了正常的滞后时间。

如果您的应用程序必须在几毫秒内响应添加的几个文件,您不应该使用 Java(NIO 或其他),而应该使用 C/C++。这将大大增加您的代码的复杂性。

关于java - 为什么使用 WatchService 检测文件更改会出现延迟? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13448131/

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