File.java使用变量作为:

private final transient int prefixLength;


并说,这是“抽象路径名的前缀”。

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类的getFileSystem()方法返回UnixFileSystem的对象。因此,方法fs.prefixLength()实际上调用UnixFileSystem的prefixLength()方法。 UnixFileSystem的prefixLength()方法实现为:

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


意味着此方法将仅返回0或1,具体取决于路径名的长度或路径名的第一个字符。

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

最佳答案

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

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


上面的前缀是c:\

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

支持\\c:c:\\的Windows实现如下所示:

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 */
}

10-08 01:58