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