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 上的安装位置?
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的解决办法