
本文介绍如何使用 Java NIO 的 Path API 在 Kotlin 中优雅地合并绝对与相对路径,并自动消除冗余部分(如 ..),避免手动字符串拼接,确保路径正确性和跨平台兼容性。
本文介绍如何使用 java nio 的 `path` api 在 kotlin 中优雅地合并绝对与相对路径,并自动消除冗余部分(如 `..`),避免手动字符串拼接,确保路径正确性和跨平台兼容性。
在 Kotlin(JVM 环境)中处理文件路径时,直接操作字符串(如 split('/')、replace() 或手动遍历 ..)不仅易出错,还难以应对不同操作系统路径分隔符(如 Windows 的 \ 与 Unix 的 /)、符号链接、空段等边界情况。推荐方案是借助标准、健壮且跨平台的 java.nio.file.Path 类。
Path 提供了语义清晰的核心方法:
-
resolve(other: String):将相对路径“解析”到当前路径下(类似cd行为); -
normalize():移除冗余组件(如.、..及其抵消路径段),返回逻辑上最简的等效路径。
例如,给定基础路径 "a/b/c"(注意:这是相对路径,非绝对路径;绝对路径需以根目录开头,如 /a/b/c 或 C:\a\b\c),要向上回退两级得到 "a",可这样实现:
import java.nio.file.Path
import java.nio.file.Paths
fun main() {
val base = Paths.get("a/b/c") // 或 Path.of("a/b/c")(Java 11+)
val resolved = base.resolve("../../").normalize()
println(resolved) // 输出:a
println(resolved.toString()) // 字符串形式:a
}
✅ 关键优势:
- 自动处理路径分隔符(
Paths.get()会使用系统默认分隔符,normalize()逻辑与 OS 无关); - 正确解析
..:a/b/c/../../→a,a/../b→b,a/b/./c→a/b/c; - 安全可靠:不依赖正则或字符串索引,无路径遍历漏洞风险。
⚠️ 注意事项:
-
resolve()对绝对路径参数会直接返回该绝对路径(忽略 base),因此确保传入的是相对路径字符串(如"../"而非"/../"); - 若 base 本身是绝对路径(如
Paths.get("/home/user/project")),resolve("../../src")将生成/home/src(即从根开始计算),符合预期; -
normalize()不访问文件系统,纯内存运算,高效且无副作用。
总结:始终优先使用 Path.resolve() + Path.normalize() 组合替代字符串拼接。它不仅是最佳实践,更是 JVM 平台上路径操作的权威标准方案——简洁、安全、可移植。










