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

时间:2009-07-15 13:03:28

标签: java url uri filepath file-uri

我正在运行的系统是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的权限部分是什么,文件协议中是否真的没有?

3 个答案:

答案 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

RFC3986 (3.2.2. Host)州:

  

“如果URI方案定义了主机的默认值,那么当主机子组件未定义或注册名称为空(零长度)时,该默认值适用。例如,定义”文件“URI方案,以便不权限,空主机和“localhost”都意味着最终用户的机器,而“http”方案认为缺少权限或空主机无效。“

因此,“文件”方案将file:///path/file转换为具有最终用户机器的上下文,即使权限是空主机。

答案 2 :(得分:1)

就在浏览器中使用它而言,无关紧要。我通常看到file:///...但是一,二或三'/'都会起作用。这让我觉得(不看java文档)这将是正常的行为。