- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,当一个文件被添加到目录时,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/
我有一个 WatchService 实现,其中服务使用 key = watchService.poll() 或 take() 方法监视目录。但我面临的问题是,如果我在启动 poll() 或 take(
我尝试将一个非常小的文件复制并粘贴到监视服务观察到的文件夹中。第一次效果很好,但在接下来的所有复制和粘贴操作中,我收到一个异常,即另一个进程已经处理该文件。通过实验,我发现我的服务会在 Windows
我正在寻找一种在注册 WatchService 的路径时传递参数的方法。目标是在处理与 Path 相关的事件时获取这些参数。 WatchService watchService = FileSyste
public static void main (String args[]) throws Exception { Path _directotyToWatch = Paths.ge
我正在与我的软件用户合作,当我的软件添加文件夹监视时遇到问题。对 register 的调用似乎永远阻塞。这是来自用户机器的线程转储: platformExecutor [01-12_10:14]" I
我有一个 scala 类,它使用 java nio WatchService 来检测特定目录中新文件夹的创建。 当应用程序运行并且我手动将文件夹复制到目标文件夹时,WatchService 运行良好。
我有以下文件和文件夹结构: /root/ /root/pictures/ /root/pictures/picture1.jpg /root/pictures/picture2.jpg 我注册了两个
我有一个 WatchService 为以下代码抛出一个 ClosedWatchServiceException: final WatchService watchService = FileSyste
我有一个递归监视服务,用于在应用程序运行时监视目录。由于未知原因, watch 服务似乎在大约一天后停止工作。那时,我可以将新文件添加到受监视的目录中,并且不会收到任何日志语句,并且我的观察者不会收到
如何对这样的 watchservice 进行单元测试: /** * Function to look for changes in a determinate directory * @param
我正在尝试使用 Java Watchservice (NIO) 来监视多个目录,我可以在所有目录中看到创建事件,但我无法追溯到创建文件的目录。 例如,每当创建一个新文件时,我只能看到一个文件名(没有路
我想使用 Java 7 WatchService监视 /proc 文件夹,但这不起作用(不报告文件夹中所做的更改)。我已经测试了其他文件夹,例如 /home/user/Desktop 和 /tmp 并
我想每 10 秒轮询一个目录,看看是否有任何文件被添加或修改。如果它们在 10 秒内有任何变化,我想要一组所有文件路径,然后我可以将其传递给另一个方法。 问题 添加文件后,它会立即被识别并调用 add
我一直在研究 java.nio.file.WatchService并注意到 Path s 从 WatchEvent.context() 返回不返回正确的 .toAbsolutePath() .这是一个
我试图将一个非常小的文件复制并粘贴到监视服务观察到的文件夹中。第一次效果很好,但在接下来的所有复制和粘贴操作中,我得到一个异常,另一个进程已经处理了该文件。通过实验,我发现当 Windows 创建文件
我正在使用 java.nio WatchService 来监视文件系统的变化(对于 webapp syncing project )。 但是,当我清理监视的目录时,我遇到一个文件正在使用的问题(事实上
我在使用 WatchService 时遇到问题。这是我的代码片段: public void watch(){ //define a folder root Path myDir = Paths
我实现了一个文件观察器,但我注意到 java nio 文件观察器不会为在映射驱动器上复制的文件生成事件。例如,我在 Unix 上运行文件观察器来观察映射到 windows (H:\) 上的本地目录 (
我正在使用 WatchService 来监视文件夹及其子文件夹中创建的新文件。但是,当创建文件时,WatchService 会给出所创建文件的名称,而不是其位置。有没有办法获取所创建文件的绝对/相对路
我想使用新的 Java 7 WatchService 来监视用户指定的一组目录。在 Windows 7 上,这在本地文件系统和任意复杂的文件树的映射网络驱动器上运行良好。然而,在 Windows XP
我是一名优秀的程序员,十分优秀!