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

Posted

技术标签:

【中文标题】Java:Windows 文件上的 File.toURI().toURL()【英文标题】:Java : File.toURI().toURL() on Windows file 【发布时间】:2010-11-11 00:05:00 【问题描述】:

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

【问题讨论】:

真希望你在s前面加空格... 您在哪个版本的 Windows 上运行?实际上,您是否可以使用新的 URL(String) 将其解析回来并不重要。 @kd304 :如果我用 URL(String) 以外的东西解析结果,这很重要,我会这样做。 有趣的是,java.net.URL 的 javadoc 仍然引用原始的 NCSA Mosaic 帮助页面,不出所料,这是一个死链接。我想我可能会对此提出一个错误.... @kd304 : 不是我自己,而是其他一些图书馆。 【参考方案1】:

这是一个有趣的问题。

首先要做的是:我在 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 总是有两个斜杠。

【讨论】:

是的,但是:tools.ietf.org/html/rfc1738。第 3.10 节告诉我文件应该在 URL 中有双斜杠。 RFC3986 1.1 节末尾的例子有这个例子:file:///etc/hosts。 我也注意到了这一点。有时我认为他们应该让规范更易于阅读。 Section 3.2.2 of RFC 3986 通过指出 authority 可能为空来澄清这一点:“如果 URI 方案为主机定义了默认值,那么当主机子组件未定义或当注册的名称是空的(零长度)。例如,“file” URI 方案被定义为没有权限、空主机和“localhost”都表示最终用户的机器,而“http”方案考虑一个缺少权限或空主机无效。" 是的,正如 GhiOm 所说,URL RFC1738 似乎与此相矛盾:另见 superuser.com/questions/352133。请注意,某些库需要三斜杠版本,例如 Subversion Java 绑定 JavaHL API,因此您必须手动执行 "file://" + myFile.toURI().getRawPath()【参考方案2】:

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

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

RFC3986 (3.2.2. Host) 状态:

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

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

【讨论】:

【参考方案3】:

就在浏览器中使用它而言,没关系。我通常见过file:///...,但是一个、两个或三个“/”都可以。这让我觉得(没有查看 java 文档)这将是正常行为。

【讨论】:

我理解 3 个斜杠:// + /C: 这是合乎逻辑的。问题是我没有使用浏览器。 3 个斜杠在 UNIX 类型的系统上是有意义的;第三个斜线是根目录。 file:///etc/passwd 是 /etc/passwd 文件。

以上是关于Java:Windows 文件上的 File.toURI().toURL()的主要内容,如果未能解决你的问题,请参考以下文章

如何找到 Java 在 Windows 10 上的安装位置?

在 Windows 上的两个 java 版本之间切换

iOS项目添加.pch文件 / How to add a .pch file to an iOS project

error: could not lock config file */to/.ssh/loc/.gitconfig: No such file or directory的解决办法

error: could not lock config file */to/.ssh/loc/.gitconfig: No such file or directory的解决办法

无法验证证书 - 请设置 'ENV['SSL_CERT_FILE'] = path_to_file'