Java NIO中Paths.get("/","/")在Windows报错Linux正常如何解决?
解决Windows下
Paths.get("/","/")抛出InvalidPathException的问题 这个坑我之前踩过,核心原因是Linux和Windows的路径解析逻辑完全不一样:
- 在Linux上,路径解析器会自动合并多个连续的根斜杠
/,所以Paths.get("/","/")最终会被解析成合法的根路径/,自然没问题。 - 但在Windows上,
java.nio.fs.WindowsPathParser会把以双斜杠开头的路径识别为UNC路径(也就是我们常说的网络共享路径,格式是\\主机名\共享名)。当你传入两个/时,拼接后变成/\/,转成Windows风格的路径就是\\,但这个路径缺少必要的主机名,所以直接抛出InvalidPathException,提示"UNC path is missing hostname"。
几个可行的解决方案:
直接使用单个根路径:如果你的需求就是获取系统根目录,完全没必要传两个
/,直接写Paths.get("/")就好,跨平台都能正常解析(Windows上会映射到当前默认盘符的根目录,比如C:\)。用
normalize()规范化路径:如果是动态场景下不小心生成了重复的根路径,可以调用Path.normalize()方法让系统自动处理路径格式:
Path path = Paths.get("/", "/").normalize(); // Windows下会输出当前盘根目录,比如C:\;Linux下输出/
- 使用系统原生分隔符构建路径:为了更严谨的跨平台兼容,可以通过
FileSystems获取当前系统的路径分隔符和根目录:
// 获取当前系统的根目录(Windows会取默认盘根,Linux取/) Path rootPath = FileSystems.getDefault().getRootDirectories().iterator().next();
这样处理后,不管在Linux还是Windows环境下,路径解析都能符合系统规则,不会再出现异常了。
内容的提问来源于stack exchange,提问作者Subhabrata Mondal
相关产品推荐
相关产品推荐

