Im on Linux and my Java application is not intended to be portable.
I'm looking for a way to identify a file uniquely in Java. I can make use of statfs syscall since the pair (f_fsid, ino) uniquely identifies a file (not only across a file system) as specified here: http://man7.org/linux/man-pages/man2/statfs.2.html
The question is if it is possible extract fsid from Java directly so I can avoid writing JNI function?
inode can be extracted with NIO, but how about fsid? inode and fsid comes from different structure and are operated by different syscalls...
解决方案
This java example demonstrates how to get the unix inode number of a file.
import java.nio.file.*;
import java.nio.file.attribute.*;
public class MyFile {
public static void main(String[] args) throws Exception {
BasicFileAttributes attr = null;
Path path = Paths.get("MyFile.java");
attr = Files.readAttributes(path, BasicFileAttributes.class);
Object fileKey = attr.fileKey();
String s = fileKey.toString();
String inode = s.substring(s.indexOf("ino=") + 4, s.indexOf(")"));
System.out.println("Inode: " + inode);
}
}
The output
$ java MyFile
Inode: 664938
$ ls -i MyFile.java
664938 MyFile.java