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

猜你喜欢

转载自blog.csdn.net/xiaocszn/article/details/81708997