简体   繁体   中英

Read file attributes using RandomAccessFile

Is it possible to get any of the file attributes using RandomAccessFile ?

By file attributes I mean Unix implementation provided in the class 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;

    //
}

Usage of third-party libraries is acceptable (and desirable) in case it is not possible to do that in plain Java.

In JDK, the only built-in bridge from Java land to fstat function is sun.nio.fs.UnixFileAttributes.get() method. This is private API, which can be called only using Reflection. But it works in all versions of OpenJDK from 7 to 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());
        }
    }

Other possible solutions would involve native libraries (JNI / JNA / JNR-FFI). But you'd still need to obtain a native fd from FileDescriptor object, either using Reflection or JNI.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM