Чтение атрибутов файла с использованием RandomAccessFile - PullRequest
0 голосов
/ 28 апреля 2020

Можно ли получить какие-либо атрибуты файла, используя RandomAccessFile?

Под атрибутами файла я подразумеваю реализацию Unix, представленную в классе UnixFileAttributes:

class UnixFileAttributes
    implements PosixFileAttributes
{
    private int     st_mode;
    private long    st_ino;
    private long    st_dev;
    private long    st_rdev;
    private int     st_nlink;
    private int     st_uid;
    private int     st_gid;
    private long    st_size;
    private long    st_atime_sec;
    private long    st_atime_nsec;
    private long    st_mtime_sec;
    private long    st_mtime_nsec;
    private long    st_ctime_sec;
    private long    st_ctime_nsec;
    private long    st_birthtime_sec;

    //
}

Использование сторонних библиотек допустимо (и желательно) если это невозможно сделать простым текстом Java.

1 Ответ

2 голосов
/ 29 апреля 2020

В 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.

...