Java 中的 getPath()、getAbsolutePath() 和 getCanonicalPath() 有什么区别?
2022-08-31 04:12:57
在 Java 中, 、 和 有什么区别?getPath()
getAbsolutePath()
getCanonicalPath()
我什么时候使用每一个?
在 Java 中, 、 和 有什么区别?getPath()
getAbsolutePath()
getCanonicalPath()
我什么时候使用每一个?
请考虑以下文件名:
C:\temp\file.txt
- 这是一条路径,一条绝对路径和一条规范路径。
.\file.txt
- 这是一条路。它既不是绝对路径,也不是规范路径。
C:\temp\myapp\bin\..\\..\file.txt
- 这是一条路径和一条绝对路径。这不是一个规范的路径。
规范路径始终是绝对路径。
从路径转换为规范路径使其绝对(通常附加在当前工作目录上,例如 变为 )。文件的规范路径只是“净化”路径,删除和解析诸如符号链接之类的东西(在unix上)。./file.txt
c:/temp/file.txt
..\
另请注意以下带有 nio 的示例。路径:
String canonical_path_string = "C:\\Windows\\System32\\";
String absolute_path_string = "C:\\Windows\\System32\\drivers\\..\\";
System.out.println(Paths.get(canonical_path_string).getParent());
System.out.println(Paths.get(absolute_path_string).getParent());
虽然两条路径都引用相同的位置,但输出将完全不同:
C:\Windows
C:\Windows\System32\drivers
我发现要了解这样的事情,最好的方法是尝试一下:
import java.io.File;
public class PathTesting {
public static void main(String [] args) {
File f = new File("test/.././file.txt");
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
try {
System.out.println(f.getCanonicalPath());
}
catch(Exception e) {}
}
}
您的输出将如下所示:
test\..\.\file.txt
C:\projects\sandbox\trunk\test\..\.\file.txt
C:\projects\sandbox\trunk\file.txt
因此,为您提供基于File对象的路径,该对象可能是相对的,也可能不是相对的; 为您提供文件的绝对路径;并为您提供文件的唯一绝对路径。请注意,有大量的绝对路径指向同一文件,但只有一个规范路径。getPath()
getAbsolutePath()
getCanonicalPath()
何时使用每种方法?这取决于您要尝试完成的任务,但如果您尝试查看两个文件是否指向磁盘上的同一文件,则可以比较它们的规范路径。仅举一例。Files