我正在寻找一种有效的方法来检索存储在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有一个黑客:反射可以用来访问UnixFileAttributes.ctime()。但是,这段代码需要更改ctime()-method的可访问性,这对于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实用程序方法。
发布于 2022-11-14 15:12:21
对于Java9和更高版本,setAccessible()检查模块权限,而您的模块没有这些权限。可以使用VM选项--add-opens java.base/sun.nio.fs=ALL-UNNAMED解锁。
https://stackoverflow.com/questions/46676279
复制相似问题