如何在 Java 中找到 moved/renamed 的文件
How to find a file that's been moved/renamed in Java
我想要某种类型的文件句柄来保存文件 moves/renames。这不一定是独立于平台的,如果它只适用于 Java7+linux 就没问题,如果可以假定文件不更改目录就更好了。
用例是我想编写一个类似于 logstash-file-input 的日志拖尾输入源,即我可以 运行 拖尾文件的工具,即使该文件已轮换(即 moved/renamed)当我的尾随应用程序关闭时,我希望能够在尾随应用程序再次启动时找到该文件。
我查看了 BasicFileAttributes.fileKey,但我还没有找到从 fileKey 到 File/Path 对象的任何方法。
有谁知道这是否可以做到?
最好的问候
/托马斯
这是一个简单的演示,设置一个 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() );
}
如果在 ./experiments
中执行 mv xyz.dat abc.dat
而此程序正在等待 take()
调用,则会创建包含以下事件的 WatchKey:
ENTRY_DELETE zyx.dat
ENTRY_CREATE xyz.dat
上下文是从目录到更改元素的相对路径。
稍后 可以通过确定文件的设备和 inode 来在 Linux 上注册文件的 "identity",也许还可以添加大小和创建日期。然后,您可以在重新获得控制权后,假设它是同一目录来搜索该文件。
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。
我想要某种类型的文件句柄来保存文件 moves/renames。这不一定是独立于平台的,如果它只适用于 Java7+linux 就没问题,如果可以假定文件不更改目录就更好了。
用例是我想编写一个类似于 logstash-file-input 的日志拖尾输入源,即我可以 运行 拖尾文件的工具,即使该文件已轮换(即 moved/renamed)当我的尾随应用程序关闭时,我希望能够在尾随应用程序再次启动时找到该文件。
我查看了 BasicFileAttributes.fileKey,但我还没有找到从 fileKey 到 File/Path 对象的任何方法。
有谁知道这是否可以做到?
最好的问候 /托马斯
这是一个简单的演示,设置一个 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() );
}
如果在 ./experiments
中执行 mv xyz.dat abc.dat
而此程序正在等待 take()
调用,则会创建包含以下事件的 WatchKey:
ENTRY_DELETE zyx.dat
ENTRY_CREATE xyz.dat
上下文是从目录到更改元素的相对路径。
稍后 可以通过确定文件的设备和 inode 来在 Linux 上注册文件的 "identity",也许还可以添加大小和创建日期。然后,您可以在重新获得控制权后,假设它是同一目录来搜索该文件。
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。