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

时间:2017-10-10 21:25:33

标签: java nio

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

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() - 方法的可访问性,对于带有InaccessibleObjectException的Java 9,该方法将失败。

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实用工具。

0 个答案:

没有答案