FileSystems.getDefault().getPath() 仅获取路径工厂,真正跨平台路径生成依赖 resolve() 等方法自动适配分隔符;推荐用 Paths.get("a", "b") 替代 new File().toPath();处理用户路径须先 normalize() 再校验 startsWith(root) 防越界。

直接用 FileSystems.getDefault().getPath() 本身**不生成路径**,它只是获取默认文件系统的路径工厂;真正生成跨平台路径的是其返回对象的 resolve()、resolveSibling()、relativize() 等方法——它们自动使用当前系统的路径分隔符(如 Windows 用 \,Linux/macOS 用 /),并正确处理相对/绝对逻辑。
用 resolve() 拼接路径,避免硬编码分隔符
不要手动拼字符串(如 "dir" + File.separator + "file.txt" 或 "dir/file.txt"),而是用 Path.resolve():
Path base = Paths.get("config");-
Path full = base.resolve("db").resolve("settings.json");→ 在 Windows 上是config\db\settings.json,在 macOS 上是config/db/settings.json - 支持字符串和 Path 参数:
base.resolve(Paths.get("db", "settings.json"))同样安全
用 Paths.get() 替代 new File().toPath(),更简洁且语义清晰
Paths.get() 是 FileSystems.getDefault().getPath() 的静态便捷入口,语义明确、写法简短:
- ✅ 推荐:
Path p = Paths.get("data", "logs", "app.log"); - ❌ 不推荐:
Path p = new File("data", "logs", "app.log").toPath();(绕路,且 File 构造本身不跨平台) - ⚠️ 注意:
Paths.get("a/b/c")中的斜杠会被自动标准化(Windows 下也转为\),但建议仍用多参数形式,避免意外斜杠解析
处理用户输入或配置中的路径时,先 normalize() 再使用
外部路径(如配置文件、命令行参数)可能含 ..、.、重复分隔符或混合斜杠。用 normalize() 清理:
Path unsafe = Paths.get("config/../data/./logs//app.log");-
Path safe = unsafe.normalize();→ 统一为data\logs\app.log(Win)或data/logs/app.log(Unix) - 搭配
toAbsolutePath()可转为绝对路径,再 normalize 更稳妥(尤其当输入是相对路径时)
读写前校验路径安全性,防止越界访问
跨平台不等于无风险。用户传入 "../../etc/passwd" 可能突破应用目录。用 startsWith() 做白名单校验:
- 定义合法根目录:
Path root = Paths.get("/opt/myapp").toAbsolutePath().normalize(); - 检查目标路径:
if (!target.normalize().startsWith(root)) { throw new SecurityException("非法路径访问"); } - 注意:必须先
normalize(),否则startsWith()对../判断会失效










