一、三者相同点
1、路径分隔符根据操作系统改变,Windows操作系统使用"\"分隔,Unix操作系统使用"/"分隔。
2、路径最后一个字符不为分隔符。
二、getAbsolutePath、getCanonicalPath相同点
相对路径都会以当前代码执行路径以父路径取绝对路径。如/home在Windows操作系统下属于相对路径,D:在Unix操作系统下属于相对路径。
三、getCanonicalPath不同点
1、判断路径是否有效,无效则抛出IOException异常,检测代码如下:
final boolean isInvalid() {
if (status == null) {
status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
: PathStatus.INVALID;
}
return status == PathStatus.INVALID;
}
2、处理“..”和“.”。
3、解析符号连接(Unix系统)。
4、驱动器号转化成大写格式(Microsoft Windows 平台)。
5、如果是Windows操作系统,大小写不敏感,则会取实际的路径,如存在D:\ExistDir,取D:/existdir的路径时,会返回D:\ExistDir。
注:如果使用../表示上一层目录超过了原有的目录层次,只会取当前执行路径的根目录。
四、测试代码:
五、测试结果:
1、环境:Windows操作系统,JDK1.7.0_80,在D:\testPath下执行,存在D:\ExistDir。
2、环境:Redhat操作系统,JDK1.7.0_80,在/home/ExistDir下执行,存在/home/ExistDir。