Java 9:如何在 FileVisitor.visitFile() 中检索 ctime?

2023-12-22

我正在寻找一种有效的方法来检索ctime信息存储在sun.nio.fs.UnixFileAttributes期间Files.walkFileTree:

Files.walkFileTree(root, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, new FileVisitor<Path>() {
  public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    // get ctime from BasicFileAttributes here
  }
}

Java 8 有一个 hack:可以使用反射来访问UnixFileAttributes.ctime()。然而,此代码需要更改ctime()- 对于 Java 9 将失败的方法InaccessibleObjectException.

Class<?> basicFileAttributesClass = Class.forName("java.nio.file.attribute.BasicFileAttributes");
Class<?> unixFileAttributesClass = Class.forName("sun.nio.fs.UnixFileAttributes");

Method toUnixFileAttributesMethod = unixFileAttributesClass.getDeclaredMethod("toUnixFileAttributes", basicFileAttributesClass);
toUnixFileAttributesMethod.setAccessible(true);

Method cTimeMethod = unixFileAttributesClass.getDeclaredMethod("ctime");
cTimeMethod.setAccessible(true);

Object unixFileAttributes = toUnixFileAttributesMethod.invoke(unixFileAttributesClass, attributes);
((FileTime)cTimeMethod.invoke(unixFileAttributes)).toMillis();

我仍然希望错过一些完成这项工作的 NIO 实用程序方法。


对于 Java 9 及更高版本,setAccessible()检查您的模块没有的模块权限。这可以通过 VM 选项解锁--add-opens java.base/sun.nio.fs=ALL-UNNAMED.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 9:如何在 FileVisitor.visitFile() 中检索 ctime? 的相关文章

随机推荐