17

我正在 Windows 上开发 Scala 应用程序,我需要将文件路径插入 HTML 模板。我使用 Javaionio处理文件和路径。

/* 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)

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

因为我在文档中找不到类似的东西file/path.toStringUsingSeparator('/'),所以我目前正在帮助自己relativeIncludesPath.toString.replace('\\', '/'),我觉得这很不吸引人。

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

我也尝试过 Java 的URI,但它relativize不完整的。

4

4 回答 4

5

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

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

于 2012-11-09T14:50:16.527 回答
1

我刚遇到这个问题。如果你有一个相对路径,你可以使用它Path的一个Iterable<Path>元素,跟随一个可选的初始根元素,然后可以自己用正斜杠连接这些片段。不幸的是,根元素可以包含斜杠,例如在 Windows 中,您会得到像c:\\\foo\bar\(对于 UNC 路径)这样的根元素,因此无论您仍然需要用正斜杠替换什么,似乎都是如此。但是你可以做这样的事情......

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 路径中可以有反斜杠吗?)

于 2016-04-06T18:51:58.550 回答
0

基于这个iterator想法(我的问题类似:需要网页的路径,但它必须是相对的并以斜杠开头)

StringBuilder foo = new StringBuilder();
relative.iterator().forEachRemaining(part -> foo.append("/").append(part));

foo将包含适当的路径。

于 2021-12-02T13:10:59.413 回答
-2

您可以在 Java 中获取大多数系统属性。看看这个链接:

http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

你要这个:

Key: "file.separator"
Meaning: Character that separates components of a file path. This is "/" on UNIX and "\" on Windows.

String sep = System.getProperty("path.separator");
于 2012-07-15T18:29:11.873 回答