0

我一直认为URLs 可以通过这个构造函数组成,并且类似于

new URL(new URL("file:/foo/bar/"), "images/a.png")

我明白了

file:/foo/bar/images/a.png

正如预期的那样。1但是,从OneJar我获得了一个看起来很奇怪的 URL 和结果

new URL(new URL("onejar:foo.bar"), "images.a.png")

简直就是

onejar:images.a.png

父路径被简单地删除。我尝试用 or 为这些部分添加前缀或后缀/.但没有任何变化。更新:这不是真的,见下文。

这是一个错误还是我错过了什么?我必须通过字符串来做吗(感觉很hacky)。

更新:

我看到尾部斜线确实有帮助。无论出于何种原因,onejar使用点作为分隔符,但它似乎也接受斜线。因此,我可以将原始 URLonejar:foo.bar转换为字符串、追加/和转换回 URL。然后可以通过上面提到的构造函数组合结果,所以它似乎是正确的方法。


1 除非我忘记了斜杠,我经常这样做,但这是另一回事。

4

1 回答 1

2

所以,好吧,除了您要调用的构造函数使用URL对象作为第一个参数而不是 a之外,我猜您看到的行为可能与方案 URI 是分层String的这一事实有关,但如果您不这样做filet 提供任何层次结构符号(即斜线),构造函数将规范部分(即第二个参数)优先于上下文部分(即第一个参数)。

例如,当您忘记尾随斜杠时file:/foo/bar,您真正表示的是bar目录中的文件foo。如果您传递相对路径,例如images/a.png,构造函数会尽可能地结合两者:当然它不能将相对路径附加到它认为是文件的文件中file:/foo/bar/images/a.png,因此它只是将bar文件替换为您作为第二个参数传递的文件,作为结果给出file:/foo/images/a.png

这同样适用于您的第二个示例:file:foo.bar表示foo.bar文件,但是当您传递表示images.a.png文件的第二个参数时,替换发生如前面示例中所述,结果为file:images.a.png. 我相信,发生这种情况是因为您缺少层次结构符号(即斜线),您需要在这些符号中获得所需的结果。

这确实是一个猜测,而不是一个很好的知情答案。

但是,当您键入:

URL url = new URL(new URL("file:foo.bar/"), "images.a.png");
System.out.println(url);

/如您所说,在其中一个部分后缀后缀,结果确实发生了变化,与您确认的相反,给出了以下结果:

file:foo.bar/images.a.png

这似乎与我的猜测一致。

不过,由于我从未使用过 OneJar,因此您的问题不清楚您的输入到底是什么,以及您想要获得什么。

于 2014-01-26T11:45:47.700 回答