本机跑得好好的代码,扔到 Linux 服务器上就报文件不存在。日志里那行路径看着没问题,仔细一瞧,分隔符是 Windows 的反斜杠。这个问题在跨平台项目里出现得特别频繁。
它到底返回什么
Java 里 File.separator 是一个字符串,值是当前系统的路径分隔符。Windows 上拿到的是反斜杠,Linux 和 macOS 上拿到的是正斜杠。配套的 File.separatorChar 是同一个符号的字符形式,用在哪一边取决于你的变量类型。
所以它的作用是让代码适配运行环境,不是让你手写路径时少打两个字。写成字符串加 File.separator 再拼文件名,跨系统能跑,但代码里到处是加号,反而不容易看出层级。
拼路径有更稳的写法
用 Paths.get 或者 Path.of,把目录和文件名分开传进去,分隔符由它自己补,多一层少一层都不会出问题。老代码里常见的 new File 加两个参数也是同样道理,父目录一个参数,子文件名一个参数。
要注意别在末尾自己多补一个分隔符。拼接出来的路径带双分隔符,多数系统会当成同一个,个别组件解析时却会出错,排查起来很费劲。
这些场景不该用它
拼 URL、拼前端资源地址、写 classpath 里的资源名、正则表达式里表示路径,这些都该用正斜杠,跟操作系统无关。用 separator 拼出来反斜杠,放进 URL 里会被当成转义符,接口直接 404。
配置文件里的路径也是同理。你在 Windows 上写完测通了,配置里存的是反斜杠,换到容器里跑就解析失败。稳妥做法是配置里统一用正斜杠,JDK 在 Windows 上读正斜杠的路径同样认。
别和 pathSeparator 搞混
File.pathSeparator 是分隔多个路径用的,比如环境变量里一长串目录,Windows 用分号,Linux 用冒号。名字只差几个字母,作用完全不同,写错过的人不少。
结论很直接:能用 Path 拼就用 Path,实在要手写,跨平台的代码里统一用正斜杠,separator 只留给必须适配系统分隔符的场合。