我使用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_DELETE
和ENTRY_MODIFY
个事件的上下文是Path
用手表注册的目录 之间的 相对路径 服务以及创建,删除或修改的条目 。
但sun.nio.fs.AbstractWatchKey
包含字段private final Path dir
。但是这个类是包私有的。有没有办法获取WatchEvent#context
返回的文件所属的目录名?
UPD:为我想要观看的每个目录创建inotify实例听起来真的很奇怪。
答案 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