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

时间:2016-09-01 09:30:27

标签: java file filesystems pathname

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,具体取决于路径名的长度或路径名的第一个字符。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

  • 1)它的长度是多少?
  • 2)它的意义是什么?

1)此长度表示文件路径是否具有条形名称。在unix文件系统中,重要的是要知道....

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

2)当您尝试访问此文件路径中的文件时,可能会使用它来获取" /"考虑到..