在jdk7监视服务API中,什么时候会抛出OVERFLOW事件?

Vit*_*liy 7 java io java-7 nio2

对溢出文件规定:

OVERFLOW - 表示事件可能已丢失或丢弃.

它没有说在什么情况下我应该期望事件丢失或丢弃?起初我以为这是将很多文件写入文件夹的结果.我创建了几千个零大小的文件,并将它们移动到受监控的目录.没有溢出.

我错过了什么?

Fil*_*dor 6

"文件系统可以比检索或处理事件更快地报告事件,并且实现可能会对可能累积的事件数量施加未指定的限制.如果实现有意丢弃事件,则它会安排密钥的pollEvents方法返回元素事件类型为OVERFLOW.消费者可以使用此事件作为重新检查对象状态的触发器."

来自JavaDoc.

另见Steven C的回答.我认为他关于未消耗事件的观点有所不同.


Ste*_*n C 6

我创建了几千个零大小的文件,并将它们移动到受监控的目录.没有溢出.

据推测,您在创建事件的同时消耗了这些事件.如果要触发溢出,请尝试暂停消耗事件,生成大量事件(如上所述),然后恢复消耗.操作系统可以缓冲的未使用事件数量必然会受到限制.


Cir*_*四事件 6

产生溢出的最小示例

刚过创建的文件watcherService.register和前watcherService.take

调用:

java Overflow 256
Run Code Online (Sandbox Code Playgroud)

控制事件的数量。

Java 7和Ubuntu 14.04最多可容纳512个事件。

每次发生溢出时,只会返回一个事件pollEvents(),但这在Javadoc上没有明确指定。

考虑到以下原因,我觉得这个限制太小很奇怪:

代码:

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchService;
import java.util.List;

public class Overflow {

    @SuppressWarnings("unchecked")
    static <T> WatchEvent<T> cast(WatchEvent<?> event) {
        return (WatchEvent<T>)event;
    }

    public static void main(final String[] args) throws InterruptedException, IOException {
        int nfiles;
        if (args.length > 0)
            nfiles = Integer.parseInt(args[0]);
        else
            nfiles = 10_000;
        Path directory = Files.createTempDirectory("watch-service-overflow");
        final WatchService watchService = FileSystems.getDefault().newWatchService();
        directory.register(
                watchService,
                StandardWatchEventKinds.ENTRY_CREATE,
                StandardWatchEventKinds.ENTRY_DELETE);
        final Path p = directory.resolve(Paths.get("Hello World!"));
        for (int i = 0; i < nfiles; i++) {
            Files.createFile(p);
            Files.delete(p);
        }
        List<WatchEvent<?>> events = watchService.take().pollEvents();
        for (final WatchEvent<?> event : events) {
            if (event.kind() == StandardWatchEventKinds.OVERFLOW) {
                System.out.println("Overflow.");
                System.out.println("Number of events: " + events.size());
                return;
            }
        }
        System.out.println("No overflow.");
        Files.delete(directory);
    }
}
Run Code Online (Sandbox Code Playgroud)