考虑一个从这样开始的方法:
private void writeFile(String dir, String name) {
Path path = Paths.get(dir, name);
// create & write to file, etc...
现在,此方法的调用者可能希望在指定目录中创建该文件,例如以下某个目录:
问题是最后一个(即Paths.get("\\", "x.txt")
)会出现以下错误:
线程“main”中的异常java.nio.file.InvalidPathException:UNC路径缺少sharename:\\ x.txt
这会被视为错误吗?如果没有,您将如何在Windows中的当前驱动器的根目录中创建文件?
答案 0 :(得分:3)
是的,我认为这是一个错误。
如果查看WindowsFileSystem.getPath(String paramString, String... paramVarArgs)
的代码,您将找到此代码(jdk1.8.0_51,未包含WindowsFileSystem的源代码,因此这来自反汇编程序):
public final Path getPath(String paramString, String... paramVarArgs)
{
String str1;
if (paramVarArgs.length == 0) {
str1 = paramString;
} else {
StringBuilder localStringBuilder = new StringBuilder();
localStringBuilder.append(paramString);
for (String str2 : paramVarArgs) {
if (str2.length() > 0) {
if (localStringBuilder.length() > 0)
localStringBuilder.append('\\');
localStringBuilder.append(str2);
}
}
str1 = localStringBuilder.toString();
}
return WindowsPath.parse(this, str1);
}
代码在元素之间添加\
,即使前面的元素已经以\
结尾,依赖于a\\b
在a\b
中压缩到WindowsPath.parse()
方法。
因此,get("\\", "x.txt")
变为\\x.txt
,并且开头的两个\
是UNC路径,因此parse()
失败。
建议,如果你想提交bug。将代码更改为:
if (str2.length() > 0) {
if (localStringBuilder.length() > 0) {
char c = localStringBuilder.charAt(localStringBuilder.length() - 1);
if (c != '\\' && c != '/')
localStringBuilder.append('\\');
}
localStringBuilder.append(str2);
}