使用Java唯一标识文件

Som*_*ame 6 java jvm nio file

我在Linux上,我的Java应用程序不是可移植的.

我正在寻找一种在Java中唯一标识文件的方法.我可以使用statfs系统调用,因为该对(f_fsid, ino)唯一地标识了一个文件(不仅跨文件系统),如下所示:http://man7.org/linux/man-pages/man2/statfs.2.html

问题是如果可以fsid直接从Java中提取,那么我可以避免编写JNI函数吗?

inode可以提取NIO,但fsid怎么样?inode和fsid来自不同的结构,由不同的系统调用...

Hai*_*Dog 4

这个java例子演示了如何获取文件的unix inode号。

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出

$ java MyFile
Inode: 664938

$ ls -i MyFile.java 
664938 MyFile.java
Run Code Online (Sandbox Code Playgroud)

信用到期的信用: https: //www.javacodex.com/More-Examples/1/8

  • @SomeName 你可以通过 `Files.getFileStore` 访问 FileStore 怎么样?https://docs.oracle.com/javase/8/docs/api/java/nio/file/FileStore.html https://docs.oracle.com/javase/8/docs/api/java/nio/file /Files.html#getFileStore-java.nio.file.Path- (2认同)
  • @SomeName 目前还不清楚在哪一点上真正需要使用 Java 代码或使用本机代码。Java NIO 有一种唯一标识文件的方法(“fileKey()”返回的对象可以做到这一点),并且它还有一个监视服务抽象。请注意,答案的代码会花费很大的篇幅来破坏文件密钥的唯一性。它首先将其转换为“String”,然后从中提取不唯一的 inode。如果您查看原始字符串表示形式,您会看到类似“(dev=xxx,inode=yyy)”的内容,清楚地暗示密钥对象确实唯一标识该文件。 (2认同)