В JDK единственным встроенным мостом от Java land до fstat
является метод sun.nio.fs.UnixFileAttributes.get()
. Это частный API, который можно вызвать только с помощью Reflection. Но он работает во всех версиях OpenJDK с 7 по 14.
public static PosixFileAttributes getAttributes(FileDescriptor fd)
throws ReflectiveOperationException {
Field f = FileDescriptor.class.getDeclaredField("fd");
f.setAccessible(true);
Class<?> cls = Class.forName("sun.nio.fs.UnixFileAttributes");
Method m = cls.getDeclaredMethod("get", int.class);
m.setAccessible(true);
return (PosixFileAttributes) m.invoke(null, f.get(fd));
}
public static void main(String[] args) throws Exception {
try (RandomAccessFile raf = new RandomAccessFile(args[0], "r")) {
PosixFileAttributes attr = getAttributes(raf.getFD());
System.out.println(attr.permissions());
}
}
Другие возможные решения будут включать нативные библиотеки (JNI / JNA / JNR-FFI). Но вам все равно нужно получить собственный fd из FileDescriptor
объекта, используя Reflection или JNI.