Windows上的Paths.get

时间:2015-11-16 16:44:18

标签: java

考虑一个从这样开始的方法:

private void writeFile(String dir, String name) {
    Path path = Paths.get(dir, name);
    // create & write to file, etc...

现在,此方法的调用者可能希望在指定目录中创建该文件,例如以下某个目录:

  1. “C:\ path \ to \ dir”指定驱动器上的绝对路径
  2. “path \ to \ dir” relative path
  3. “\ path \ to \ _dir”当前驱动器上的绝对路径
  4. “C:\”指定驱动器的根目录
  5. “\”当前驱动器的根目录
  6. 问题是最后一个(即Paths.get("\\", "x.txt"))会出现以下错误:

    线程“main”中的异常java.nio.file.InvalidPathException:UNC路径缺少sharename:\\ x.txt

    这会被视为错误吗?如果没有,您将如何在Windows中的当前驱动器的根目录中创建文件?

1 个答案:

答案 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\\ba\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);
      }