getPath返回原始构造路径,不解析;getAbsolutePath补全为绝对路径但保留“.”和“..”;getCanonicalPath则进一步规范化,解析冗余符号、符号链接并确保路径唯一有效。

getAbsolutePath 返回的是基于当前工作目录拼接出来的绝对路径,但不处理路径中的 .(当前目录)和 ..(上级目录);getCanonicalPath 则在此基础上进一步“规范化”:解析掉所有冗余符号、展开符号链接(Unix)、统一驱动器大小写(Windows),并确保路径真实存在且唯一。
getPath 是原始输入,不加工
它只是把构造 File 对象时传入的字符串原样返回,不管是不是相对路径、含不含 . 或 ..。比如 new File("../data/./file.txt") 调用 getPath() 就直接输出 ../data/./file.txt。
getAbsolutePath 补全为绝对路径,但保留冗余
它会把相对路径加上当前工作目录(System.getProperty("user.dir"))变成绝对路径,但不做任何简化:
- 若原始路径已是绝对路径(如
"D:\test\a.txt"),结果与getPath()相同; - 若为相对路径(如
"../config/app.conf"),结果类似"D:\project\..\config\app.conf"—— 看似绝对,但含未解析的..; - 不检查文件是否存在,也不处理符号链接。
getCanonicalPath 解析真实路径,要求路径可达
它先调用 getAbsolutePath() 得到初始绝对路径,再做三件事:
立即学习“Java免费学习笔记(深入)”;
- 把路径中所有
.和..按实际目录结构展开(例如D:\a\..\b→D:\b); - 如果路径指向符号链接(Linux/macOS)或重定向(Windows Junction),会追踪到最终目标;
- 必须能访问对应位置 —— 若路径不存在或权限不足,会抛出
IOException。
因此,同一文件可能有多个 getAbsolutePath() 结果(如 C:x.y.txt 和 C:xy.txt),但 getCanonicalPath() 一定返回唯一标准形式。
什么时候该用哪个?
判断依据很简单:
- 只记录原始路径或拼接路径字符串 → 用
getPath(); - 需要完整路径做日志、临时文件命名,不关心是否“干净” → 用
getAbsolutePath(); - 要做路径等价判断(比如防止目录遍历攻击)、校验文件归属、或确保路径真实有效 → 必须用
getCanonicalPath()。
比如校验用户上传路径是否在允许目录内,若只比对 getAbsolutePath(),../../../etc/passwd 可能绕过检测;而 getCanonicalPath() 会把它转成 /etc/passwd,一眼就能拦截。


















