zoukankan      html  css  js  c++  java
  • 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());
            
        }
    得到的结果:

    -----默认相对路径:取得路径不同------
    .	est1.txt
    D:workspace	est.	est1.txt
    -----默认绝对路径:取得路径同样------
    D:workspace	est	est1.txt
    D:workspace	est	est1.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	est..src	est1.txt
    D:workspacesrc	est1.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:	ext.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");决定了结果.














  • 相关阅读:
    sql server 数据库可疑处理方法。
    执行gpedit.msc 提示找不到程序
    uni-app Post springboot 后台接收数据为null 解决办法
    组件接口升级商品编码文件
    mysql 拼接字符
    mysql 截取前7位
    为什么具有编程思维的孩子更容易成功?孩子为什么要学编程?你想要的答案都在这儿!
    利用支持MicroPython的TPYBoard开发板自制PM2.5检测仪(萝卜教育学科式编程)
    Micropython教程实例之USB-HID应用(萝卜学科编程)
    教程Micropython自制小型家庭气象站(萝卜教育)
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6979001.html
Copyright © 2011-2022 走看看