我运行的系统是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
为什么给定的URL在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的权限部分,它是否真的在文件协议中缺失?
发布于 2009-07-15 13:40:04
这是一个有趣的问题。
首先要做的是:我在JRE6上得到了同样的结果。当我去掉toURL()部分时,我甚至得到了它。
RFC2396实际上不需要两个斜杠。根据第3条:
URI语法取决于方案。通常,绝对URI的编写方式如下:
话虽如此,RFC2396已经被RFC3986取代,后者表示
通用URI语法由称为方案、授权、路径、查询和片段的组件的分层序列组成。
URI = scheme ":“hier-part "?”查询hier-part = "//“权限路径-abempty/路径-绝对/路径-无根/路径-空
方案和路径组件是必需的,但路径可能为空(无字符)。如果有权限,则路径必须为空或以斜杠("/")字符开头。当权限不存在时,路径不能以两个斜杠字符("//")开头。这些限制为路径产生了五个不同的ABNF规则(3.3节),其中只有一个与任何给定的URI引用相匹配。
所以,就是这样。由于文件URI没有权限段,因此禁止它们以//开头。
然而,RFC直到2005年才出现,而且Java引用了RFC2396,所以我不知道它为什么要遵循这种约定,因为新RFC之前文件URL总是有两个斜杠。
发布于 2012-01-22 05:55:59
要回答为什么你可以两者兼得:
file:/path/file
file:///path/file
file://localhost/path/file
“如果URI方案为主机定义了默认值,则当未定义主机子组件或注册名称为空(长度为零)时,该默认值适用。例如,定义”文件“URI方案时,没有颁发机构、空主机和"localhost”都表示最终用户的计算机,而"http“方案将缺少颁发机构或空主机视为无效。”
因此,“文件”方案将file:///path/file
转换为具有最终用户机器的上下文,即使授权机构是空主机也是如此。
发布于 2009-07-15 13:28:27
就在浏览器中使用它而言,这并不重要。我通常会看到file:///...
,但一个、两个或三个'/‘都可以工作。这让我认为(不看java文档)这是正常行为。
https://stackoverflow.com/questions/1131273
复制相似问题