应优先使用 Paths.get() 拼接路径,它自动处理平台分隔符并归一化;File.separator 仅适用于 Java 6 或纯字符串组装场景,且不可与 File.pathSeparator 混用。

为什么不能直接用 / 或 拼接路径
硬写斜杠在 Windows 上可能“碰巧”能跑,但 File.separator 不是摆设——它解决的是路径语义一致性问题。比如 "a/b" + File.separator + "c" 在 Linux 返回 a/b/c,在 Windows 返回 a/bc;而你手写 "a/b/c" 在 Windows 上虽然 File.exists() 可能返回 true(因系统兼容斜杠),但遇到 Paths.get()、ClassLoader.getResource() 或某些安全策略校验时,会因路径规范化失败而抛 NullPointerException 或 IllegalArgumentException。
- Windows 下用
/有时能读文件,但new File("a/b/c").getCanonicalPath()可能崩或返回意外结果 -
File.separator是字符串,不是常量表达式,无法在static final String初始化中直接参与编译期拼接 - Java 7+ 推荐用
Paths.get(),它内部已处理分隔符,比手动拼File.separator更可靠
Paths.get() 是当前最稳的路径拼接方式
它不依赖 File.separator,也不关心平台,底层自动归一化。传入多个 String 参数,会按顺序拼成一个 Path 对象,且支持相对路径解析(如第一个参数是 "..")。
- 正确用法:
Paths.get("config", "app.properties")→config/app.properties(Linux)或configpp.properties(Windows) - 避免这样写:
Paths.get("config" + File.separator + "app.properties")——多此一举,还可能因空格或编码引发异常 - 如果已有字符串路径需兼容旧逻辑,先用
Paths.get(pathString)转为Path,再调resolve()拼接,别再字符串层面操作
什么时候还必须用 File.separator
仅限两种场景:一是维护 Java 6 项目(没 Paths);二是做纯字符串组装且不立即构造 File 或 Path(例如日志打印、配置项拼写)。但要注意它只是字符串,不校验合法性。
-
File.separator值在 Windows 是"\"(注意转义),不是"";直接写"ac"会报编译错误 - 若拼接后要传给
System.setProperty("user.dir", ...)这类接受字符串的 API,才需显式用File.separator - 千万别用它拼 URL(如
http://host/a/b/c)——URL 必须用/,和文件系统无关
常见错误:File.separator 和 File.pathSeparator 混用
前者是目录分隔符(/ 或 ),后者是 classpath 中多个路径的分隔符(Linux 是 :,Windows 是 ;)。写错会导致 ClassNotFoundException 或资源加载失败。
立即学习“Java免费学习笔记(深入)”;
- 错误示例:
"lib/a.jar" + File.separator + "lib/b.jar"→ 得到lib.jarlib.jar,classpath 解析直接失效 - 正确写法:
"lib/a.jar" + File.pathSeparator + "lib/b.jar" - IDE 运行时默认 classpath 分隔符由 JVM 决定,但打包成脚本时(如 shell/bat),必须手动适配
File.pathSeparator
File.separator。








