我一直认为URL
可以通过此constructor组成,并且可以使用类似
new URL(new URL("file:/foo/bar/"), "images/a.png")
我得到了
file:/foo/bar/images/a.png
正如预期的那样。 1 然而,从OneJar我获得了一个奇怪的网址和
的结果new URL(new URL("onejar:foo.bar"), "images.a.png")
就是
onejar:images.a.png
简单地删除父路径。我尝试使用/
或.
为部分添加前缀或后缀,但没有任何变化。 更新:情况并非如此,请参阅下文。
这是一个错误还是我错过了什么?我是否必须通过字符串(这感觉相当hacky)来做。
我看到尾部的斜线确实有帮助。无论出于何种原因,onejar
使用点作为分隔符,但它似乎也接受斜杠。因此,我可以将onejar:foo.bar
之类的原始网址转换为字符串,附加/
,然后转换回网址。然后可以通过上面提到的构造函数来组合结果,所以它似乎是正确的方法。
1,除非我忘记了我经常做的尾随斜线,但这是另一回事。
答案 0 :(得分:2)
所以,除了你要调用的构造函数使用URL
对象作为第一个参数而不是String
这一事实之外,我想你看到的行为可能与某些事情有关。事件file
方案URI是分层的,但如果你不提供任何层次结构符号(即斜杠),构造函数优先于上下文部分的规范部分(即第二个参数)(即第一个)参数)。
例如,当您忘记file:/foo/bar
上的尾部斜杠时,您真正指出的是目录bar
中的文件foo
。如果你传递一个相对路径,如images/a.png
,构造函数尽可能地将两者结合起来:当然它不能附加它认为是文件的相对路径,结果给出{{1所以它只是将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);
后缀附加到其中一个部分,正如您所说的那样,结果确实发生变化,与您所确认的相反,会产生以下结果:
/
这似乎与我的猜测一致。
尽管如此,由于我从未使用过OneJar,因此您的问题不清楚您的输入是什么,以及您希望获得的结果。