在Java中侦听多个目录以创建文件

时间:2018-04-17 12:39:12

标签: java file jvm nio

我使用inotify nio包装器来捕获特定目录中的文件创建。好的,我有这个

private final String tmpDir1 = Files.createTempDirectory(null);
private final String tmpDir2 = Files.createTempDirectory(null);

WatchService watchService = FileSystems.getDefault.newWatchService()

Paths.get(tmpDir1).register(watchService, ENTRY_CREATE)
Paths.get(tmpDir2).register(watchService, ENTRY_CREATE)

public String getModifiedFilePath(){
    WatchKey key = ((WatchEvent<Path>) watchService.take())
    //Does p belongs to tmpDir1 or tmpDir2?
    Path p = ((WatchEvent<Path>)(key.pollEvents().iterator().next())).context()
    return //???
}

如方法WatchEvent#context

的文档中所述
  

返回事件的上下文。在ENTRY_CREATE的情况下,   ENTRY_DELETEENTRY_MODIFY个事件的上下文是Path   用手表注册的目录 之间的 相对路径    服务以及创建,删除或修改的条目

sun.nio.fs.AbstractWatchKey包含字段private final Path dir。但是这个类是包私有的。有没有办法获取WatchEvent#context返回的文件所属的目录名?

UPD:为我想要观看的每个目录创建inotify实例听起来真的很奇怪。

2 个答案:

答案 0 :(得分:2)

享受

public Path getModifiedFilePath() throws InterruptedException {
    WatchKey key = watchService.take();
    return (Path) key.watchable();
}

答案 1 :(得分:1)

通过使用Java Reflection API,您可以修改访问修饰符。 Set private field value with reflection