【转】File类的getPath、getAbsolutePath跟getCanonicalPath的不同
【转】File类的getPath、getAbsolutePath和getCanonicalPath的不同
一、概念上的不同
1 |
getPath |
2 |
public String getPath()
|
3 |
将此抽象路径名转换为一个路径名字符串。所得字符串使用默认名称分隔符分隔名称序列中的名称。 |
4 |
返回: |
5 |
此抽象路径名的字符串形式 |
---------------------------------------------------------
01 |
getAbsolutePath |
02 |
public String getAbsolutePath()
|
03 |
返回此抽象路径名的绝对路径名字符串。 |
04 |
如果此抽象路径名已经是绝对路径名,则返回该路径名字符串,这与 getPath() 方法一样。如果此抽象路径名是空抽象路径名,则返回当前用户目录的路径名字符串,该目录由系统属性 user.dir 指定。否则,使用与系统有关的方式解析此路径名。在 UNIX 系统上,根据当前用户目录解析相对路径名,可使该路径名成为绝对路径名。在 Microsoft Windows 系统上,根据路径名指定的当前驱动器目录(如果有)解析相对路径名,可使该路径名成为绝对路径名;否则,可以根据当前用户目录解析它。 |
05 |
返回: |
06 |
绝对路径名字符串,它与此抽象路径名表示相同的文件或目录 |
07 |
抛出: |
08 |
SecurityException - 如果无法访问所需的系统属性值。 |
09 |
另请参见: |
10 |
isAbsolute() |
---------------------------------------------------------
01 |
getCanonicalPath |
02 |
public String getCanonicalPath()
|
03 |
throws IOException
|
04 |
返回此抽象路径名的规范路径名字符串。 |
05 |
规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换为绝对路径名,这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的名称(比如 "." 和 ".." )、解析符号连接(对于 UNIX 平台),以及将驱动器号转换为标准大小写形式(对于 Microsoft Windows 平台)。
|
06 |
每个表示现存文件或目录的路径名都有一个惟一的规范形式。每个表示不存在文件或目录的路径名也有一个惟一的规范形式。不存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现存文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。 |
07 |
返回: |
08 |
规范路径名字符串,它与此抽象路径名表示相同的文件或目录 |
09 |
抛出: |
10 |
IOException - 如果发生 I/O 错误(可能是因为构造规范路径名需要进行文件系统查询) |
11 |
SecurityException - 如果无法访问所需的系统属性值,或者存在安全管理器,且其SecurityManager.checkRead(java.io.FileDescriptor) 方法拒绝对文件进行读访问 |
12 |
从以下版本开始: |
13 |
JDK1. 1
|
二、实例解析
1.getPath()与getAbsolutePath()的区别
01 |
public void diff_pathAndAbsolutePath(){
|
02 |
File file1 = new File( ".\\test1.txt" );
|
03 |
File file2 = new File( "D:\\workspace\\test\\test1.txt" );
|
04 |
System.out.println( "-----默认相对路径:取得路径不同------" );
|
05 |
System.out.println(file1.getPath());
|
06 |
System.out.println(file1.getAbsolutePath());
|
07 |
System.out.println( "-----默认绝对路径:取得路径相同------" );
|
08 |
System.out.println(file2.getPath());
|
09 |
System.out.println(file2.getAbsolutePath());
|
10 |
} |
得到的结果:
1 |
-----默认相对路径:取得路径不同------ |
2 |
.\test1.txt |
3 |
D:\workspace\test\.\test1.txt |
4 |
-----默认绝对路径:取得路径相同------ |
5 |
D:\workspace\test\test1.txt |
6 |
D:\workspace\test\test1.txt |
结论:
getPath得到的是构造参数的路径。
getAbsolutePath得到的是全路径。如果构造参数是相对路径,则返回当前目录的绝对路径+构造参数路径;如果是绝对路径则直接返回。
2.getAbsolutePath()与getCanonicalPath()的区别
1 |
public void diff_AbsolutePathAndCanonicalPath() throws IOException{
|
2 |
File file = new File( "..\\src\\test1.txt" );
|
3 |
System.out.println(file.getAbsolutePath());
|
4 |
System.out.println(file.getCanonicalPath());
|
5 |
} |
得到的结果:
1 |
D:\workspace\test\..\src\test1.txt |
2 |
D:\workspace\src\test1.txt |
结论:
getCanonicalPath得到的不仅是全路径,而且会解析并剔除[..]这样的符号,即给出一个标准的绝对路径。
3.getCanonicalPath()与自身的区别
就是解释这段话:
1 |
每个表示现存文件或目录的路径名都有一个惟一的规范形式。每个表示不存在文件或目录的路径名也有一个惟一的规范形式。不存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现存文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。 |
1 |
public void diff_canonicalPathAndSelf() throws IOException{
|
2 |
File file = new File( "D:\\Text.txt" );
|
3 |
System.out.println(file.getCanonicalPath());
|
4 |
} |
操作步骤:
(1)确定你的系统是Windows系统。确定D盘下没有Text.txt这个文件,直接执行这段代码,得到的结果是:
1 |
D:\Text.txt |
(2)在D盘下建立一个文件,名叫text.txt,再次执行代码,得到结果是:
1 |
D:\text.txt |
(3)在linux系统中按以上步骤运行代码。得到的结果是:
1 |
两次结果一样。 |
结论:
window是大小写不敏感的,也就是说在windows上test.txt和Test.txt是一个文件,所以在windows上当文件不存在时,得到的路径就是按照输入的路径。但当文件存在时,就会按照实际的情况来显示。这也就是建立文件后和删除文件后会有不同的原因。文件夹和文件类似。而在linux系统中,大小写是敏感的。