用Java唯一标识文件

时间:2018-12-26 18:17:18

标签: java file jvm nio

我在Linux上,而我的Java应用程序并非旨在可移植。

我正在寻找一种用Java唯一标识文件的方法。我可以使用statfs系统调用,因为这对(f_fsid, ino)唯一标识一个文件(不仅在整个文件系统中),而且在此处指定:http://man7.org/linux/man-pages/man2/statfs.2.html

问题是,是否可以直接从Java中提取fsid,以便避免编写JNI函数?

inode可以用NIO提取,但是fsid呢? inode和fsid来自不同的结构,并由不同的系统调用操作...

2 个答案:

答案 0 :(得分:3)

这个Java示例演示了如何获取文件的unix索引节点号。

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);
  }
}

输出

$ java MyFile
Inode: 664938

$ ls -i MyFile.java 
664938 MyFile.java

应归还的信用额:https://www.javacodex.com/More-Examples/1/8

答案 1 :(得分:2)

我建议使用散列文件内容的GIT方法。这是防止复制和重命名的证据。

Java应该是独立于平台的,因此使用Unix特定方法可能不是您想要的。