Java:Windows文件上的File.toURI()。toURL()

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我运行的系统是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的权威部分是空或空的,因此跳过了双斜线。那么URL的权威部分是什么,它真的不在文件协议中?

提问于
用户回答回答于

这是一个有趣的问题。

首先要做的是:我在JRE6上得到了相同的结果。我甚至在我关闭toURL()的时候得到了这个结果。

RFC2396实际上并不需要两个斜杠。根据第3节:

URI语法取决于方案。一般来说,绝对URI的写法如下: <scheme>:<scheme-specific-part>

话虽如此,RFC2396已被RFC3986所取代,该规定称

通用URI语法由称为方案,权威,路径,查询和片段的元组的分级序列组成。 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总是有两个斜线。

用户回答回答于

要回答为什么你可以同时拥有:

file:/path/file
file:///path/file
file://localhost/path/file

声明:

“如果URI方案为主机定义了一个默认值,那么当主机子组件未定义或注册名称为空(零长度)时,该默认值适用,例如,”文件“URI方案被定义为没有权限,空主机和“本地主机”都表示最终用户的机器,而“http”方案认为缺少权限或空主机无效。“

因此,file:///path/file即使权限是空主机,“file”方案也会转换为最终用户计算机的上下文。

扫码关注云+社区