我希望对文件移动/重命名的文件有一些文件句柄。这不一定是独立于平台的,如果它只适用于Java7 + linux,那就没问题,如果可以假设文件不能改变目录,那就更好了。
用例是我想编写类似于logstash-file-input的日志尾部输入源,即我可以运行以拖尾文件的工具,即使该文件被旋转(即移动/重命名)当我的拖尾应用程序关闭时,我希望能够在拖尾应用程序再次启动时找到该文件。
我查看了BasicFileAttributes.fileKey但我还没有找到任何方法从fileKey转到File / Path对象。
有人知道是否可以这样做吗?
最诚挚的问候 /托马斯
答案 0 :(得分:1)
这是一个简单的演示,设置WatchService并等待事件:
Path dir = Paths.get( "/home", "me", "experiments" );
WatchService watcher = dir.getFileSystem().newWatchService();
dir.register( watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY );
WatchKey key = watcher.take();
for (WatchEvent<?> event: key.pollEvents()) {
System.out.println( event.kind().name() + " " + event.context() );
}
如果此程序在mv xyz.dat abc.dat
调用中等待./experiments
中take()
执行,则会创建包含以下事件的WatchKey:
ENTRY_DELETE zyx.dat
ENTRY_CREATE xyz.dat
上下文是从目录到更改元素的相对路径。
稍后可以注册&#34;身份&#34;通过确定其设备和inode来确定Linux上的文件,也可以添加大小和创建日期。然后,您可以在重新获得控制权后,搜索此文件,假设它是同一目录。
Path dir = Paths.get( "/home", "wlaun", "Java_Experiments" );
Path file = dir.resolve( "a.log" );
Object fileKey = Files.getAttribute( file, "fileKey" );
Object creaTime = Files.getAttribute( file, "creationTime" );
System.out.println( fileKey.toString() + creaTime.toString() );
我应该补充一点,1.8.0_20似乎混淆了creationTime和lastAccessTime。