3

我想对在文件移动/重命名后仍然存在的文件有某种文件句柄。这不一定是平台独立的,如果它只适用于 Java7+linux 就可以了,如果可以假设文件不会更改目录,那就更好了。

用例是我想编写一个类似于logstash-file-input的日志拖尾输入源,即我可以运行来拖尾文件的工具,即使当我旋转该文件(即移动/重命名)时拖尾应用程序已关闭,我希望能够在拖尾应用程序再次启动时找到该文件。

我查看了 BasicFileAttributes.fileKey 但我没有找到从 fileKey 到 File/Path 对象的任何方法。

有谁知道这是否可以做到?

最好的问候/托马斯

4

1 回答 1

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执行了 a ,则会创建一个包含以下事件的 WatchKey:./experimentstake()

ENTRY_DELETE zyx.dat
ENTRY_CREATE xyz.dat

上下文是从目录到更改元素的相对路径。

稍后可以通过确定文件的设备和 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。

于 2015-02-28T12:46:32.467 回答