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

glm*_*ndr 16 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();
    }       
}
Run Code Online (Sandbox Code Playgroud)

我明白了 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());
    }
Run Code Online (Sandbox Code Playgroud)

似乎文件URL的Authority部分为null或为空,因此跳过双斜杠.那么URL的权限部分是什么?它是否真的不存在于文件协议中?

Pow*_*ord 12

这是一个有趣的问题.

首先要做的是:我在JRE6上获得了相同的结果.当我丢掉toURL()部分时,我甚至会得到它.

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

URI语法取决于方案.通常,绝对URI编写如下:

<scheme>:<scheme-specific-part>
Run Code Online (Sandbox Code Playgroud)

话虽如此,RFC2396已被RFC3986取代,后者表示

通用URI语法由一系列的omponents组成,称为方案,权限,路径,查询和片段.

  URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

  hier-part   = "//" authority path-abempty
              / path-absolute
              / path-rootless
              / path-empty
Run Code Online (Sandbox Code Playgroud)

方案和路径组件是必需的,但路径可能为空(无字符).当存在权限时,路径必须为空或以斜杠("/")字符开头.当权限不存在时,路径不能以两个斜杠字符("//")开头.这些限制导致路径的五个不同的ABNF规则(第3.3节),其中只有一个匹配任何给定的URI引用.

所以,你去吧.由于文件URI没有权限段,因此禁止它们以//开头.

但是,RFC直到2005年才出现,Java引用RFC2396,所以我不知道为什么它遵循这个约定,因为新RFC之前的文件URL总是有两个斜杠.

  • [RFC 3986 的第 3.2.2 节](http://tools.ietf.org/html/rfc3986#section-3.2.2) 通过指出 `authority` 可能为空来澄清这一点:“_如果 URI 方案定义了一个主机的默认值,那么当主机子组件未定义或注册名称为空(零长度)时,该默认值适用。例如,“文件”URI 方案被定义为没有权限、空主机和“本地主机”都意味着最终用户的机器,而“http”方案认为缺少权限或空主机无效。_” (2认同)
  • 是的URL RFC1738似乎与GhiOm说的相矛盾:另请参阅http://superuser.com/questions/352133.请注意*某些库需要三斜杠版本*,例如Subversion Java绑定JavaHL API,因此您必须手动执行`"file://"+ myFile.toURI().getRawPath()` (2认同)