我正在运行的系统是Windows XP,JRE 1.6。
我这样做:
public static void main(String[] args) {
try {
System.out.println(new File("C:\\test a.xml").toURI().toURL());
} catch (Exception e) {
e.printStackTrace();
}
}
我得到了这个:file:/C:/test%20a.xml
为什么给定的网址在C:
之前没有两个斜杠?我期待file://C:...
。这是正常的行为吗?
编辑:
来自Java源代码:java.net.URLStreamHandler.toExternalForm(URL)
result.append(":");
if (u.getAuthority() != null && u.getAuthority().length() > 0) {
result.append("//");
result.append(u.getAuthority());
}
似乎文件URL的Authority部分为null或为空,因此跳过双斜杠。那么URL的权限部分是什么,文件协议中是否真的没有?
答案 0 :(得分:12)
这是一个有趣的问题。
首先要做的是:我在JRE6上获得了相同的结果。当我丢掉toURL()部分时,我甚至得到了它。
RFC2396实际上不需要两个斜杠。根据第3节:
URI语法取决于 方案。通常,绝对URI是 写如下:
<scheme>:<scheme-specific-part>
话虽如此,RFC2396已被RFC3986取代,其中陈述
通用URI语法由a组成 omponents的等级序列 被称为计划,权威, 路径,查询和片段。
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
方案和路径组件是 必需的,虽然路径可能是空的 (没有人物)当权威是 目前,路径必须为空 或者以斜杠(“/”)字符开头。 当权力不存在时, 路径不能以两个斜线开头 字符(“//”)。这些限制 导致五种不同的ABNF规则 对于一个路径(第3.3节),只有一个 它将匹配任何给定的URI 参考
所以,你去吧。由于文件URI没有权限段,因此禁止从//.
开始然而,RFC直到2005年才出现,Java引用RFC2396,所以我不知道为什么它遵循这个约定,因为新RFC之前的文件URL总是有两个斜杠。
答案 1 :(得分:2)
回答为什么你们两个都有:
file:/path/file
file:///path/file
file://localhost/path/file
“如果URI方案定义了主机的默认值,那么当主机子组件未定义或注册名称为空(零长度)时,该默认值适用。例如,定义”文件“URI方案,以便不权限,空主机和“localhost”都意味着最终用户的机器,而“http”方案认为缺少权限或空主机无效。“
因此,“文件”方案将file:///path/file
转换为具有最终用户机器的上下文,即使权限是空主机。
答案 2 :(得分:1)
就在浏览器中使用它而言,无关紧要。我通常看到file:///...
但是一,二或三'/'都会起作用。这让我觉得(不看java文档)这将是正常的行为。