file的getPath getAbsolutePath和getCanonicalPath的不同

Java File路径方法详解
本文详细解析了Java中File类的getPath(), getAbsolutePath(), 和getCanonicalPath()方法的区别。通过实例展示了不同路径获取方法在相对路径和绝对路径下的表现,以及它们如何处理特殊符号如.和..。

file的这几个取得path的方法各有不同,下边说说详细的区别

 

概念上的区别:(内容来自jdk,个人感觉这个描述信息,只能让明白的人明白,不明白的人看起来还是有点难度(特别试中文版,英文版稍好些)所以在概念之后我会举例说明。如果感觉看概念很累就跳过直接看例子吧。看完例子回来看概念会好些。

getPath

public String getPath()将此抽象路径名转换为一个路径名字符串。所得到的字符串使用默认名称分隔符来分隔名称序列中的名称。 

 

返回:

此抽象路径名的字符串形式

 

 

getAbsolutePath

public String getAbsolutePath()返回抽象路径名的绝对路径名字符串。 

如果此抽象路径名已经是绝对路径名,则返回该路径名字符串,这与 getPath() 方法一样。如果此抽象路径名是空的抽象路径名,则返回当前用户目录的路径名字符串,该目录由系统属性 user.dir 指定。否则,使用与系统有关的方式分析此路径名。在 UNIX 系统上,通过根据当前用户目录分析某一相对路径名,可使该路径名成为绝对路径名。在 Microsoft Windows 系统上,通过由路径名指定的当前驱动器目录(如果有)来分析某一相对路径名,可使该路径名成为绝对路径名;否则,可以根据当前用户目录来分析它。 

 

 

返回:

绝对路径名字符串,它与此抽象路径名表示相同的文件或目录的 

抛出: 

SecurityException - 如果无法访问所需的系统属性值。

另请参见:

isAbsolute()

 

 

getCanonicalPath

public String getCanonicalPath()

                        throws IOException返回抽象路径名的规范路径名字符串。 

规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换成绝对路径名,这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的名称(比如 "." 和 "..")、分析符号连接(对于 UNIX 平台),以及将驱动器名转换成标准大小写形式(对于 Microsoft Windows 平台)。 

 

表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。 

 

 

返回:

表示与此抽象路径名相同的文件或目录的规范路径名字符串 

抛出: 

IOException - 如果发生 I/O 错误(可能是因为构造规范路径名需要进行文件系统查询) 

SecurityException - 如果无法访问所需的系统属性值,或者存在安全管理器,且其 SecurityManager.checkRead(java.io.FileDescriptor) 方法拒绝对该文件进行读取访问

从以下版本开始: 

JDK1.1 

 

 

二、例子:

1,getPath()与getAbsolutePath()的区别

public static void test1(){

        File file1 = new File(".\\test1.txt");

        File file2 = new File("D:\\workspace\\test\\test1.txt");

        System.out.println("-----默认相对路径:取得路径不同------");

        System.out.println(file1.getPath());

        System.out.println(file1.getAbsolutePath());

        System.out.println("-----默认绝对路径:取得路径相同------");

        System.out.println(file2.getPath());

        System.out.println(file2.getAbsolutePath());

 

    }

 

得到的结果:

-----默认相对路径:取得路径不同------

.\test1.txt

D:\workspace\test\.\test1.txt

-----默认绝对路径:取得路径相同------

D:\workspace\test\test1.txt

D:\workspace\test\test1.txt

因为getPath()得到的是构造file的时候的路径。

getAbsolutePath()得到的是全路径

如果构造的时候就是全路径那直接返回全路径

如果构造的时候试相对路径,返回当前目录的路径+构造file时候的路径

 

2,getAbsolutePath()和getCanonicalPath()的不同

public static void test2() throws Exception{

        File file = new File("..\\src\\test1.txt");

        System.out.println(file.getAbsolutePath());

        System.out.println(file.getCanonicalPath());

    }

得到的结果

D:\workspace\test\..\src\test1.txt

D:\workspace\src\test1.txt

可以看到CanonicalPath不但是全路径,而且把..或者.这样的符号解析出来。

3,getCanonicalPath()和自己的不同。

就是解释这段话:

表示现有文件或目录的每个路径名都有一个惟一的规范形式。表示非存在文件或目录的每个路径名也有一个惟一的规范形式。非存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现有文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。 

 

单下边这段代码是看不到结果的,要配合一定的操作来看。下边操作步骤,同时讲解

 

public static void test3() throws Exception{

        File file = new File("D:\\Text.txt");

        System.out.println(file.getCanonicalPath());

    }

步骤:

确定你的系统是Windows系统。

(1),确定D盘下没有Text.txt这个文件,直接执行这段代码,得到的结果是:

D:\Text.txt

注意这里试大写的Text.txt

(2)在D盘下建立一个文件,名叫text.txt,再次执行代码,得到结果

D:\text.txt

同样的代码得到不同的结果。

同时可以对比getAbsolutePath()看看,这个得到的结果是一样的。

 

原因:

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

 

三、最后:

1,尝试在linux下执行上边的步骤,两次打印的结果是相同的,因为linux是大小写敏感的系统。

2,手动删掉test.txt,然后尝试执行下边代码

public static void test4() throws Exception{

        File file = new File("D:\\Text.txt");

        System.out.println(file.getCanonicalPath());

        File file1 = new File("D:\\text.txt");

        file1.createNewFile();

        file = new File("D:\\Text.txt");

        System.out.println(file.getCanonicalPath());

    }

 

public static void test3() throws Exception{

        File file1 = new File("D:\\text.txt");

        file1.createNewFile();

        File file = new File("D:\\Text.txt");

        System.out.println(file.getCanonicalPath());

    }

执行上边两个函数,看看结果,然后思考一下为什么?

1,的结果是两个大写,

2,的结果试两个小写

连续两个大写的,是否跟上边的矛盾 ?

这是因为虚拟机的缓存机制造成的。第一次File file = new File("D:\\Text.txt");决定了结果.

 

文章出处:http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html

 

<think> 我们正在讨论File类的getAbsolutePath方法。根据用户提供的引用,我们可以总结如下: 引用[1]指出: - getPath()返回构造File对象时使用的路径。 - getAbsolutePath()返回绝对路径。如果构造时是绝对路径,则直接返回;如果是相对路径,则返回当前目录的路径加上构造时的路径。 - 还提到getAbsolutePath()getCanonicalPath()的不同。 引用[2]给出了一个例子: ```java File file = new File("..\\src\\test1.txt"); System.out.println(file.getAbsolutePath()); System.out.println(file.getCanonicalPath()); ``` 这个例子展示了绝对路径规范路径的区别。 引用[3]通过例子说明: - 对于相对路径构造的File对象,getPath()返回相对路径,而getAbsolutePath()返回绝对路径(当前目录+相对路径)。 - 对于绝对路径构造的File对象,getPath()getAbsolutePath()返回相同。 引用[4]进一步解释: - 如果使用相对路径(如"program.txt")创建File对象,则getAbsolutePath()会返回从根目录开始的完整路径(绝对路径)。 - 如果使用绝对路径创建File对象,则getPath()getAbsolutePath()返回相同。 现在,用户的问题是:我想了解File.getAbsolutePath方法的作用。 因此,我们可以这样组织回答: ### File.getAbsolutePath()方法的作用 `File.getAbsolutePath()`是Java中`File`类的一个方法,用于获取文件或目录的绝对路径。绝对路径是指从文件系统的根目录开始的完整路径,它不依赖于当前工作目录。以下是该方法的具体说明: #### 1. **基本功能** - 将相对路径转换为绝对路径:如果创建`File`对象时使用的是相对路径(例如`"data.txt"`),则`getAbsolutePath()`会返回当前工作目录(由系统属性`user.dir`确定)加上该相对路径所构成的绝对路径。 ```java File file = new File("data.txt"); System.out.println(file.getAbsolutePath()); // 输出示例:/home/user/project/data.txt(取决于当前工作目录) ``` - 绝对路径保持不变:如果创建`File`对象时已经使用了绝对路径(例如`"/home/user/data.txt"`),则`getAbsolutePath()`直接返回该绝对路径。 ```java File file = new File("/home/user/data.txt"); System.out.println(file.getAbsolutePath()); // 输出:/home/user/data.txt ``` #### 2. **与getPath()的区别** - `getPath()`:返回创建`File`对象时传入的路径字符串(原样返回,可能是相对路径也可能是绝对路径)。 - `getAbsolutePath()`:总是返回绝对路径,它解析了相对路径相对于当前工作目录的位置。 示例(引用[3]): ```java File file1 = new File(".\\test1.txt"); System.out.println(file1.getPath()); // 输出:.\test1.txt System.out.println(file1.getAbsolutePath()); // 输出:当前工作目录的绝对路径+\test1.txt,例如C:\workspace\.\test1.txt File file2 = new File("D:\\workspace\\test\\test1.txt"); System.out.println(file2.getPath()); // 输出:D:\workspace\test\test1.txt System.out.println(file2.getAbsolutePath()); // 输出:D:\workspace\test\test1.txt ``` #### 3. **与getCanonicalPath()的区别** - `getAbsolutePath()`:仅保证路径是绝对的,但可能包含冗余的路径元素(如`.`表示当前目录`..`表示父目录)。 - `getCanonicalPath()`:不仅返回绝对路径,还会解析掉冗余的路径元素,得到唯一的规范路径(并且会解析符号链接,如果存在)。 示例(引用[2]): ```java File file = new File("..\\src\\test1.txt"); System.out.println(file.getAbsolutePath()); // 输出:当前工作目录的父目录\src\test1.txt,例如C:\project\..\src\test1.txt System.out.println(file.getCanonicalPath()); // 输出:解析了..,例如C:\src\test1.txt ``` #### 4. **注意事项** - 当前工作目录:绝对路径的解析依赖于程序运行时的当前工作目录(可通过`System.getProperty("user.dir")`获取),因此同一程序在不同环境中运行可能返回不同的绝对路径。 - 路径分隔符:返回的路径使用系统默认的路径分隔符(Windows上是`\`,Linux/macOS上是`/`)。 - 不检查文件是否存在:无论文件或目录是否存在,该方法都会返回路径字符串(仅进行路径字符串的转换,不涉及文件系统检查)。 #### 5. **典型应用场景** ```java // 场景1:记录文件的绝对位置 File configFile = new File("config.properties"); String absPath = configFile.getAbsolutePath(); logger.info("配置文件位置:" + absPath); // 场景2:与相对路径配合使用 File dataDir = new File("data/input"); if (!dataDir.exists()) { dataDir.mkdirs(); // 创建目录(基于绝对路径定位) } // 场景3:需要规范路径时(注意:此时应使用getCanonicalPathFile logFile = new File("logs/../app.log"); String canonicalPath = logFile.getCanonicalPath(); // 得到"app.log"所在目录的绝对路径 ``` > **注意**:如果路径中包含`.`或`..`等相对路径符号,且需要清除这些符号得到最简路径,应使用`getCanonicalPath()`。但要注意`getCanonicalPath()`可能会抛出`IOException`(因为需要访问文件系统解析路径),而`getAbsolutePath()`不会抛出异常。 --- §§相关问题§§ 1. `File.getAbsolutePath()``File.getCanonicalPath()`在性能上有何差异? 2. 如何安全地处理包含相对路径符号(如`..`)的文件路径? 3. 为什么`getAbsolutePath()`返回的路径中可能包含冗余的`.`或`..`? 4. 在多线程环境下使用`getAbsolutePath()`是否安全? [^1]: 引用自Java中filegetPath(),getAbsolutePath(),getCanonicalPath()方法区别 [^2]: 引用自示例代码 [^3]: 引用自filegetPath getAbsolutePathgetCanonicalPath的区别 [^4]: 引用自java getabsolutepath_Java File getAbsolutePath()用法及代码示例 </think> ### File.getAbsolutePath() 方法的作用 `File.getAbsolutePath()` 是 Java `File` 类中的核心方法,用于获取文件或目录的**绝对路径**。它的核心作用是通过解析路径,返回一个不依赖当前工作环境的完整文件路径。以下是详细说明: #### 1. **核心功能** - **路径标准化**:将相对路径转换为从文件系统根目录开始的完整路径 ```java File file = new File("data.txt"); System.out.println(file.getAbsolutePath()); // 输出示例:/home/user/project/data.txt(Linux) // 输出示例:C:\project\data.txt(Windows) ``` - **绝对路径保持原样**:若构造时已是绝对路径,则直接返回原路径 ```java File file = new File("/var/log/app.log"); System.out.println(file.getAbsolutePath()); // 输出:/var/log/app.log ``` #### 2. **与相关方法的区别** | 方法 | 特点 | 示例(构造路径 `..\src\test.txt`) | |---------------------|----------------------------------------------------------------------|-------------------------------------------| | `getPath()` | 返回构造 File 对象时传入的原始路径 | `..\src\test.txt` | | `getAbsolutePath()` | 返回包含当前目录的完整路径,但保留相对符号(`.`/`..`) | `C:\project\..\src\test.txt` | | `getCanonicalPath()`| 返回解析所有相对符号后的最简绝对路径 | `C:\src\test.txt`(移除`..`) | > 引用示例(引用[2]): > ```java > File file = new File("..\\src\\test1.txt"); > System.out.println(file.getAbsolutePath()); // 输出:C:\workspace\..\src\test1.txt > System.out.println(file.getCanonicalPath()); // 输出:C:\src\test1.txt > ``` #### 3. **关键特性** - **不验证文件存在性**:仅进行路径转换,不检查文件是否真实存在 - **依赖当前目录**:基于 `System.getProperty("user.dir")` 解析相对路径 - **跨平台处理**:自动适应操作系统的路径分隔符(`/` 或 `\`) - **无异常抛出**:与 `getCanonicalPath()` 不同,此方法**不会**抛出 `IOException` #### 4. **典型应用场景** ```java // 场景1:获取可执行Jar文件的运行目录 File currentDir = new File("."); String launchPath = currentDir.getAbsolutePath(); // 输出:/opt/app(实际运行目录) // 场景2:日志文件路径记录 File logFile = new File("logs/app.log"); System.out.println("日志路径:" + logFile.getAbsolutePath()); // 输出:/opt/app/logs/app.log // 场景3:配置文件定位 File config = new File("../config/settings.properties"); String absPath = config.getAbsolutePath(); // 可用于后续路径处理(但需注意保留..符号) ``` #### 5. **注意事项** 1. **相对符号保留** 路径中的 `.`(当前目录) `..`(上级目录)不会被解析,可能产生冗余路径: ```java new File("./data/../file.txt").getAbsolutePath() // 输出:/opt/app/./data/../file.txt ``` 2. **与规范路径的区别** 需要清理冗余路径时,应使用 `getCanonicalPath()`(但会抛出 `IOException`): ```java // 获取最简路径(推荐) String cleanPath = file.getCanonicalPath(); ``` 3. **路径≠文件存在** 返回路径**不保证**文件存在,需配合 `exists()` 验证: ```java if (file.getAbsolutePath().endsWith(".txt") && file.exists()) { // 处理文本文件 } ``` > **最佳实践**:当需要持久化存储路径或显示给用户时优先使用 `getAbsolutePath()`;进行路径计算或比较时使用 `getCanonicalPath()` 避免符号干扰[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值