原文网址:
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