Paths.get()根据字符串是否以根标识符开头判定路径类型:Unix/Linux/macOS以/开头、Windows以C:或\开头为绝对路径,否则为相对路径;真正解析与标准化需调用toAbsolutePath()或normalize()等方法。

Java NIO 的 Paths.get() 本身不主动“转换”相对路径和绝对路径,而是根据传入字符串的格式(是否以根标识符开头)决定返回的 Path 是相对还是绝对。真正的路径解析与标准化逻辑,发生在调用 .toAbsolutePath() 或 .normalize() 等方法时,且依赖当前工作目录(即 JVM 启动时的 user.dir 系统属性)。
Paths.get() 如何判定相对/绝对
Paths.get(String) 的行为由字符串内容直接决定:
- 若字符串以根标识符开头(如
/在 Unix/Linux/macOS,C:或\在 Windows),则返回 绝对 Path; - 否则返回 相对 Path(即使字符串含
..或.,也不改变其相对性)。
例如:
Paths.get("data/file.txt") → 相对路径Paths.get("../config/app.conf") → 相对路径
Paths.get("/home/user/log") → 绝对路径(Linux)
Paths.get("C:\temp\test.dat") → 绝对路径(Windows)
将相对路径转为绝对路径:toAbsolutePath()
对任意 Path 调用 .toAbsolutePath(),会以当前工作目录为基准拼接,生成绝对路径(但不检查文件是否存在,也不做标准化):
立即学习“Java免费学习笔记(深入)”;
- 相对路径:
Paths.get("a/b").toAbsolutePath()→ 拼成/current/work/dir/a/b(Linux); - 已为绝对路径:
Paths.get("/x/y").toAbsolutePath()→ 返回自身(不变); - 注意:
toAbsolutePath()不处理..或.,结果可能含冗余段。
清理路径结构:normalize() 与 toRealPath()
要让路径更规范、消除 . 和 ..,需链式调用:
-
.normalize():仅做语法简化(如a/../b→b),不访问文件系统; -
.toRealPath():要求路径存在,会解析符号链接、规范化并返回绝对真实路径(隐含normalize()和toAbsolutePath()); - 常用组合:
Paths.get("a/../conf/./app.json").toAbsolutePath().normalize()→ 得到干净的绝对路径。
跨平台路径构造建议
避免硬编码分隔符,用 Paths.get(parent, child...) 多参数重载:
-
Paths.get("src", "main", "resources", "config.properties")→ 自动适配/或; - 该方式生成的路径默认是相对的,如需绝对,再加
.toAbsolutePath(); - 若 parent 已是绝对路径(如
Paths.get("/opt/app")),后续子路径仍按语义拼接,结果保持绝对。


















