File的getPath()和getAbsolutePath()和getCanonicalPath()的区别

这几个方法是有一次无意的发现,我当时也不知道什么意思,就百度了,查到了一些列子:

原文地址http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html

一:介绍

getPath()
public String getPath()

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

返回:

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

getAbsolutePath()
<pre name="code" class="java">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");决定了结果.

时间: 2024-12-22 07:47:23

File的getPath()和getAbsolutePath()和getCanonicalPath()的区别的相关文章

File的getPath()和getAbsolutePath()和getCanonicalPath()的差别

这几个方法是有一次无意的发现,我当时也不知道什么意思,就百度了,查到了一些列子: 原文地址http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html 一:介绍 getPath() public String getPath() 将此抽象路径名转换为一个路径名字符串.所得到的字符串使用默认名称分隔符来分隔名称序列中的名称. 返回: 此抽象路径名的字符串形式 getAbsolutePath() <pre name="cod

java中File类getPath()、getAbsolutePath()、getCanonicalPath()区别?

简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理"."和".."的情况 3.getCanonicalPath(): 返回的是规范化的绝对路径,相当于将getAbsolutePath()中的"."和".."解析成对应的正确的路径 第一个例子:(使用:".\\src\\test.txt&qu

file的getPath getAbsolutePath和getCanonicalPath的区别

转自:http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html file的这几个取得path的方法各有不同,下边说说详细的区别 概念上的区别:(内容来自jdk,个人感觉这个描述信息,只能让明白的人明白,不明白的人看起来还是有点难度(特别试中文版,英文版稍好些)所以在概念之后我会举例说明.如果感觉看概念很累就跳过直接看例子吧.看完例子回来看概念会好些. getPathpublic String getPath()将此抽象路径

Java笔记--File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和区别

转自:http://hi.baidu.com/danghj/item/0ef2e2c4ab95af7489ad9e39 参考资料: l < core java > 12 章 l 使用 Java 操作文本文件的方法详解  http://java.ccidnet.com/art/3737/20041108/523627_1.html l FileReader 是什么类?和 FileInputStream 有什么不同?   http://book.hackbase.com/ask2/ask10757

Shell重定向&&gt;file、2&gt;&amp;1、1&gt;&amp;2的区别

转自:http://www.360doc.com/content/13/0523/16/7044580_287544243.shtml shell上:0表示标准输入1表示标准输出2表示标准错误输出> 默认为标准输出重定向,与 1> 相同2>&1 意思是把 标准错误输出 重定向到 标准输出.&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中 用例子说话: 1. grep da * 1>&2 2. rm -f $(find / -

【56】java本地文件File类详解

1.java类的介绍 public class File extends Object implements Serializable, Comparable<File> 文件和目录路径名的抽象表示形式. File既可以表示文件也可以表示目录. 用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录.此类呈现分层路径名的一个抽象的.与系统无关的视图. 2.构造方法 File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符

File类心得

File类心得 在程序中设置路径时会有系统依赖的问题,java.io.File类提供一个抽象的.与系统独立的路径表示.给它一个路径字符串,它会将其转换为与系统无关的抽象路径表示,这个路径可以指向一个文件.目录或是URI(Uniform Resource Identifier). 一个File的实例被建立时,它就不能再被改变内容.File实例除了用作一个文件或目录的抽象表示之外,它还提供了不少相关操作方法:可以用它来对文件系统作一些查询与设置的动作.要注意的是,不管是文件还是目录,在Java中都是

Java File类学习笔记2:File类对象及常用操作方法

一. 文件.相对路径与绝对路径 1.文件 (1)标准文件:就像图片,音乐文件等. (2)目录文件:也就是平常所说的文件夹. (3)虚拟内存文件:系统在运行程序时生成的临时性文件. 2.文件的路径 (1)相对路径:相对于某一文件的路径,形象地说是把两文件的绝对路径相同的部分砍掉,剩下的就是相对路径 如: A文件是"D:\MyDocuments\StudySample\src\cn\xmh", B文件是"D:\MyDocuments\StudySample\src\netjava

计算机程序的思维逻辑 (59) - 文件和目录操作

前面两节我们介绍了如何通过流的方式读写文件内容,本节我们介绍文件元数据和目录的一些操作. 文件和目录操作最终是与操作系统和文件系统相关的,不同系统的实现是不一样的,但Java中的java.io.File类提供了统一的接口,底层它会通过本地方法调用操作系统和文件系统的具体实现,本节,我们就来介绍File类. File类中的操作大概可以分为三类: 文件元数据 文件操作 目录操作 在介绍这些操作之前,我们先来看下File的构造方法. 构造方法 File既可以表示文件,也可以表示目录,它的主要构造方法有