Java 的 File.toString 或 Path.toString,带有特定的路径分隔符

我正在Windows上开发一个Scala应用程序,我需要将文件的路径插入到HTML模板中。我使用Java并处理文件和路径。ionio

/* The paths actually come from the environment. */
val includesPath = Paths.get("foo\\inc")
val destinationPath = Paths.get("bar\\dest")

/* relativeIncludesPath.toString == "..\\foo\\inc", as expected */
val relativeIncludesPath = destinationPath.relativize(includesPath)

问题是 的输出包含反斜杠作为分隔符 - 因为应用程序在Windows上运行 - 但由于路径要插入到HTML模板中,因此它必须包含正斜杠。relativeIncludesPath.toString\/

由于我在文档中找不到类似的东西,我目前正在帮助自己,我发现这相当没有吸引力。file/path.toStringUsingSeparator('/')relativeIncludesPath.toString.replace('\\', '/')

问题:真的没有比使用替换更好的方法了吗?

我也尝试过Java,但它是不完整的URIrelativize


答案 1

Path 接口的 Windows 实现在内部将路径存储为字符串(至少在 OpenJDK 实现中),并在调用 toString() 时仅返回该表示形式。这意味着不涉及计算,也没有机会“配置”任何路径分隔符。

因此,我得出结论,您的解决方案是目前解决问题的最佳选择。


答案 2

我刚刚遇到了这个问题。如果您有一个相对路径,则可以在可选的初始根元素之后使用其元素的事实,然后可以使用正斜杠自己连接这些部分。不幸的是,根元素可以包含斜杠,例如,在Windows中,你会得到像和(对于UNC路径)这样的根元素,所以看起来无论你仍然需要用正斜杠替换什么。但是你可以做这样的事情...PathIterable<Path>c:\\\foo\bar\

static public String pathToPortableString(Path p)
{
    StringBuilder sb = new StringBuilder();
    boolean first = true;
    Path root = p.getRoot();
    if (root != null)
    {
        sb.append(root.toString().replace('\\','/'));
        /* root elements appear to contain their
         * own ending separator, so we don't set "first" to false
         */            
    }
    for (Path element : p)
    {
       if (first)
          first = false;
       else
          sb.append("/");
       sb.append(element.toString());
    }
    return sb.toString();        
}

当我用这段代码测试它时:

static public void doit(String rawpath)
{
    File f = new File(rawpath);
    Path p = f.toPath();
    System.out.println("Path: "+p.toString());
    System.out.println("      "+pathToPortableString(p));
}

static public void main(String[] args) {
    doit("\\\\quux\\foo\\bar\\baz.pdf");
    doit("c:\\foo\\bar\\baz.pdf");
    doit("\\foo\\bar\\baz.pdf");
    doit("foo\\bar\\baz.pdf");
    doit("bar\\baz.pdf");
    doit("bar\\");
    doit("bar");
}

我得到这个:

Path: \\quux\foo\bar\baz.pdf
      //quux/foo/bar/baz.pdf
Path: c:\foo\bar\baz.pdf
      c:/foo/bar/baz.pdf
Path: \foo\bar\baz.pdf
      /foo/bar/baz.pdf
Path: foo\bar\baz.pdf
      foo/bar/baz.pdf
Path: bar\baz.pdf
      bar/baz.pdf
Path: bar
      bar
Path: bar
      bar

用正斜杠替换反斜杠的文本肯定更容易,但我不知道它是否会打破一些狡猾的边缘情况。(Unix 路径中会有反斜杠吗?