Java NIO中Path和Paths是安全跨平台的路径处理组件,推荐仅用Paths.get()创建;Path不可变,提供getFileName、getParent等结构方法;resolve追加路径,resolveSibling替换末段;toAbsolutePath补全路径,toRealPath需路径存在且解析符号链接。

Java NIO 中的 Path 和 Paths 是处理文件路径的核心组件,它们取代了老式的 java.io.File,更安全、跨平台、语义清晰。关键不在于“怎么写”,而在于“怎么用得准”——尤其避免常见误用。
创建 Path 的唯一推荐方式:Paths.get()
不要用 new File("xxx").toPath(),也不建议手动实现 Path 接口。所有路径起点都应从 Paths.get() 开始:
-
Paths.get("data", "config.json")→ 自动拼成data/config.json(Windows 下为data\config.json),分隔符由系统决定 -
Paths.get("/etc")→ 创建绝对路径;Paths.get("log.txt")→ 创建相对于当前工作目录的路径 -
Paths.get("")返回当前工作目录的Path,不是空路径或非法路径 - 避免尾随斜杠:
Paths.get("/home/user/")虽不报错,但后续resolve("file.txt")可能生成/home/user//file.txt
理解 Path 的基本结构和常用方法
Path 是不可变对象,代表一段路径序列,支持快速提取结构信息:
-
path.getFileName()→ 返回最后一段(如/a/b/c.txt得c.txt) -
path.getParent()→ 去掉最后一段(/a/b/c.txt→/a/b;若已是根路径则返回null) -
path.getRoot()→ 获取根(/或C:\),没有则返回null -
path.isAbsolute()→ 判断是否为绝对路径,比检查字符串开头更可靠 -
path.getNameCount()→ 查看路径中有多少级目录/文件名(不含根)
路径拼接与替换:resolve() 和 resolveSibling()
这两个方法名字像,行为却完全不同,极易混淆:
立即学习“Java免费学习笔记(深入)”;
-
base.resolve("log.txt"):在base末尾追加,无论base是相对还是绝对路径
例如:Paths.get("/opt/app").resolve("logs/error.log")→/opt/app/logs/error.log -
base.resolveSibling("backup.sh"):丢弃base的最后一段,换上新名字
例如:Paths.get("/var/log/app.log").resolveSibling("config.yml")→/var/log/config.yml - 注意:
Paths.get("/").resolveSibling("x")会抛IllegalArgumentException,因为根路径没有“最后一段”可丢弃
绝对化与真实路径:toAbsolutePath() vs toRealPath()
二者目的不同,不能混用:
-
path.toAbsolutePath():纯字符串补全,把相对路径加上当前工作目录前缀,不访问磁盘,一定成功 -
path.toRealPath():真实 I/O 操作,要求路径存在、可访问,并自动解析符号链接、消除..和.,失败时抛IOException - 调试时别用
toRealPath()判断“路径是否合法”——它只认“存在且可达”的路径 - 需要规范化但不查存在性?可用
toAbsolutePath().normalize()


















