Java File Path, Absolute Path and Canonical Path Explained【译】

原文网址:

http://www.journaldev.com/848/java-file-path-absolute-path-and-canonical-path-explained

 

java.io.File 为确定一个文件的路径提供了三种方法,这篇文章就讲讲这三种方法。

 

getPath(): 这个方法返回抽象路径名,如果创建File对象的时候是用普通字符串pathname创建的,那么这个方法简单的返回创建时传入的那个pathname,如果File对象是使用URI传入创建的,那么返回的是去除了协议名后的文件名。

 

getAbsolutePath(): 这个方法返回文件的绝对路径,如果File是使用绝对路径名创建的,那么创建时传的路径啥样,返回的就是啥样。如果File对象是传入相对路径创建的,那么方法内部首先会将这个路径解析成绝对路径,如何解析是跟系统平台相关的,在UNIX系统上,是根据当前工作目录来解析绝对路径;而在Windows上,情况有不同,如果相对路径名里有驱动器目录(盘符),则根据这个驱动器目录来解析,否则,根据当前工作目录来解析。PS:对Windows情况不太了解,Windows里的相对路径里还可以带驱动器目录。(如:D:directory\\java.txt)

 

getCanonicalPath(): 这个方法返回的是规范化的绝对路径。方法首先会将路径转化为绝对路径(如果有必要的话),就像调用getAbsolutePath方法一样,然后将这个绝对路径映射成一个唯一路径,映射步骤通常包括删除多余的.和..,解析符号链接(UNIX系统)或者转换驱动器符号为一个标准化的形式。(Windows系统)

注意,会解析符号链接,比如:

lrwxr-xr-x    1 xiaomi  staff        9 Aug  9 11:08 sourcelink -> linktest/

建立了一个sourcelink到linktest的软链接,然后执行如下代码:

import java.io.File;
import java.io.IOException;
public class Main {
    public static void main(String[] args) {
        File file = new File("/Users/xiaomi/sourcelink/test");
        try {
            System.out.println(file.getCanonicalPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出是:

/Users/xiaomi/linktest/test

举个例子:

JavaFilePath.java

package com.journaldev.files;
 
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
 
public class JavaFilePath {
 
    public static void main(String[] args) throws IOException, URISyntaxException {
        File file = new File("/Users/pankaj/test.txt");
        printPaths(file);
        //relative path
        file = new File("test.xsd");
        printPaths(file);
        //complex relative paths
        file =new File("/Users/pankaj/../pankaj/test.txt");
        printPaths(file);
        //URI paths
        file =new File(new URI("file:///Users/pankaj/test.txt"));
        printPaths(file);
    }
 
    private static void printPaths(File file) throws IOException {
        System.out.println("Absolute Path: "+file.getAbsolutePath());
        System.out.println("Canonical Path: "+file.getCanonicalPath());
        System.out.println("Path: "+file.getPath());
    }
 
}

输出如下:

Absolute Path: /Users/pankaj/test.txt
Canonical Path: /Users/pankaj/test.txt
Path: /Users/pankaj/test.txt
Absolute Path: /Users/pankaj/CODE/r12-3-cranberry/JavaImageProcessor/test.xsd
Canonical Path: /Users/pankaj/CODE/r12-3-cranberry/JavaImageProcessor/test.xsd
Path: test.xsd
Absolute Path: /Users/pankaj/../pankaj/test.txt
Canonical Path: /Users/pankaj/test.txt
Path: /Users/pankaj/../pankaj/test.txt
Absolute Path: /Users/pankaj/test.txt
Canonical Path: /Users/pankaj/test.txt
Path: /Users/pankaj/test.txt

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值