什么是路径名字符串的前缀及其在 JAVA 中的长度?

What is a pathname string's prefix and its length in JAVA?

File.java 使用一个变量作为:

private final transient int prefixLength;

然后说,这是 "abstract pathname's prefix"。

File.java 也有一个构造函数:

public File(String pathname) {
        if (pathname == null) {
            throw new NullPointerException();
        }
        this.path = fs.normalize(pathname);
        this.prefixLength = fs.prefixLength(this.path);
    }

这里是使用fs.prefixLength()方法设置变量prefixLength。

变量 fs 在 File.java 中定义为:

private static final FileSystem fs = DefaultFileSystem.getFileSystem();

DefaultFileSystem class return UnixFileSystem 对象的 getFileSystem() 方法。所以方法 fs.prefixLength() 实际上调用了 UnixFileSystem 的 prefixLength() 方法。 UnixFileSystem的prefixLength()方法实现为:

public int prefixLength(String pathname) {
        if (pathname.length() == 0) return 0;
        return (pathname.charAt(0) == '/') ? 1 : 0;
    }

意味着此方法只会 return 0 或 1 取决于路径名的长度或路径名的第一个字符。

我的疑问是: 它是什么类型的长度,它的意义是什么?

prefixLength 背后的想法是将文件名中指示其路径根位置的部分与文件名的其余部分分开处理:

c:\quick\brown\fox.java
^^^

以上,前缀为c:\.

UNIX 实现很简单,因为只有两个初始位置是可能的 - 根 / 和当前目录(无前缀)。

Windows实现,支持\c:c:\\如下图:

public int prefixLength(String path) {
    char slash = this.slash;
    int n = path.length();
    if (n == 0) return 0;
    char c0 = path.charAt(0);
    char c1 = (n > 1) ? path.charAt(1) : 0;
    if (c0 == slash) {
        if (c1 == slash) return 2;  /* Absolute UNC pathname "\\foo" */
        return 1;                   /* Drive-relative "\foo" */
    }
    if (isLetter(c0) && (c1 == ':')) {
        if ((n > 2) && (path.charAt(2) == slash))
            return 3;               /* Absolute local pathname "z:\foo" */
        return 2;                   /* Directory-relative "z:foo" */
    }
    return 0;                       /* Completely relative */
}

你的问题不清楚,让我们试着澄清一下:

  • 1) 是什么类型的长度?
  • 2) 它的意义是什么?

1)这个长度表示文件路径中是否有带横线的名称。在 unix 文件系统中,重要的是要知道....

when "/user/some_folder" return 1
when "user/some_folder" return 0
when "" return 0

2) 当您尝试访问此文件路径中的文件以考虑“/”时,可能会使用它..