概念上的区别:(内容来自jdk,个人感觉这个描述信息,只能让明白的人明白,不明白的人看起来还是有点难度(特别试中文版,英文版稍好些)所以在概念之后我会举例说明。如果感觉看概念很累就跳过直接看例子吧。看完例子回来看概念会好些。 :::tips getPath:
public String getPath()将此抽象路径名转换为一个路径名字符串。所得到的字符串使用默认名称分隔符来分隔名称序列中的名称。
返回:
深度剖析 - 图1此抽象路径名的字符串形式 :::

:::tips getAbsolutePath:
深度剖析 - 图2public String getAbsolutePath()返回抽象路径名的绝对路径名字符串。
深度剖析 - 图3如果此抽象路径名已经是绝对路径名,则返回该路径名字符串,这与 getPath() 方法一样。如果此抽象路径名是空的抽象路径名,则返回当前用户目录的路径名字符串,该目录由系统属性 user.dir 指定。否则,使用与系统有关的方式分析此路径名。在 UNIX 系统上,通过根据当前用户目录分析某一相对路径名,可使该路径名成为绝对路径名。在 Microsoft Windows 系统上,通过由路径名指定的当前驱动器目录(如果有)来分析某一相对路径名,可使该路径名成为绝对路径名;否则,可以根据当前用户目录来分析它。
深度剖析 - 图4
深度剖析 - 图5
深度剖析 - 图6返回:
深度剖析 - 图7绝对路径名字符串,它与此抽象路径名表示相同的文件或目录的
深度剖析 - 图8抛出:
深度剖析 - 图9SecurityException - 如果无法访问所需的系统属性值。
深度剖析 - 图10另请参见:
深度剖析 - 图11isAbsolute() :::

:::tips getCanonicalPath
深度剖析 - 图12public String getCanonicalPath() throws IOException返回抽象路径名的规范路径名字符串。
深度剖析 - 图13规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换成绝对路径名,这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的名称(比如 “.” 和 “..”)、分析符号连接(对于 UNIX 平台),以及将驱动器名转换成标准大小写形式(对于 Microsoft Windows 平台)。
深度剖析 - 图14
深度剖析 - 图15表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。
深度剖析 - 图16
深度剖析 - 图17返回:
深度剖析 - 图18表示与此抽象路径名相同的文件或目录的规范路径名字符串
深度剖析 - 图19抛出:
深度剖析 - 图20IOException - 如果发生 I/O 错误(可能是因为构造规范路径名需要进行文件系统查询)
深度剖析 - 图21SecurityException - 如果无法访问所需的系统属性值,或者存在安全管理器,且其 SecurityManager.checkRead(java.io.FileDescriptor) 方法拒绝对该文件进行读取访问
深度剖析 - 图22从以下版本开始:
深度剖析 - 图23JDK1.1 :::

二、基本用法

2.1、getPath()与getAbsolutePath()的区别

  1. public static void test1(){
  2. File file1 = new File(".\\test1.txt");
  3. File file2 = new File("D:\\workspace\\test\\test1.txt");
  4. System.out.println("-----默认相对路径:取得路径不同------");
  5. System.out.println(file1.getPath());
  6. System.out.println(file1.getAbsolutePath());
  7. System.out.println("-----默认绝对路径:取得路径相同------");
  8. System.out.println(file2.getPath());
  9. System.out.println(file2.getAbsolutePath());
  10. }

得到的结果: :::tips ——-默认相对路径:取得路径不同———
深度剖析 - 图24.\test1.txt
深度剖析 - 图25D:\workspace\test.\test1.txt
深度剖析 - 图26——-默认绝对路径:取得路径相同———
深度剖析 - 图27D:\workspace\test\test1.txt
深度剖析 - 图28D:\workspace\test\test1.txt :::

  1. getPath()得到的是构造file的时候的路径。
  2. getAbsolutePath()得到的是全路径
  • 如果构造的时候就是全路径那直接返回全路径
  • 如果构造的时候试相对路径,返回当前目录的路径+构造file时候的路径

    2.2、getAbsolutePath()和getCanonicalPath()的不同

    1. public static void test2() throws Exception{
    2. File file = new File("..\\src\\test1.txt");
    3. System.out.println(file.getAbsolutePath());
    4. System.out.println(file.getCanonicalPath());
    5. }
    得到的结果 :::tips D:\workspace\test..\src\test1.txt
    D:\workspace\src\test1.txt ::: 可以看到CanonicalPath不但是全路径,而且把..或者.这样的符号解析出来。

2.3、getCanonicalPath()和自己的不同。

:::tips 深度剖析 - 图29表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。 ::: 单下边这段代码是看不到结果的,要配合一定的操作来看。下边操作步骤,同时讲解

  1. public static void test3() throws Exception{
  2. File file = new File("D:\\Text.txt");
  3. System.out.println(file.getCanonicalPath());
  4. }

步骤:
确定你的系统是Windows系统。
(1),确定D盘下没有Text.txt这个文件,直接执行这段代码,得到的结果是: :::tips 深度剖析 - 图30D:\Text.txt ::: 注意这里试大写的Text.txt
(2)在D盘下建立一个文件,名叫text.txt,再次执行代码,得到结果 :::tips D:\text.txt ::: 同样的代码得到不同的结果。
同时可以对比getAbsolutePath()看看,这个得到的结果是一样的。

原因:
window是大小写不敏感的,也就是说在windows上test.txt和Test.txt是一个文件,所以在windows上当文件不存在时,得到的路径就是按照输入的路径。但当文件存在时,就会按照实际的情况来显示。这也就是建立文件后和删除文件后会有不同的原因。文件夹和文件类似。
http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html