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编写如下:
Run Code Online (Sandbox Code Playgroud)<scheme>:<scheme-specific-part>
话虽如此,RFC2396已被RFC3986取代,后者表示
通用URI语法由一系列的omponents组成,称为方案,权限,路径,查询和片段.
Run Code Online (Sandbox Code Playgroud)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总是有两个斜杠.