令我惊讶的是,关于jdk1.8.0_u144上的代码段打印false
public class Tmp {
public static void main(String[] args) {
File f = new File(".");
boolean result = f.toPath().toUri().toString().equals(f.toURI().toString());
System.out.println("result = " + result);
}
}
显然,java.io.File#toURI
和java.nio.Path#toUri
会返回不同的演示文稿。问题是,哪一个是正确的(根据RFC 8089)?
答案 0 :(得分:1)
TLDR版本:根据RFC 8089,两种形式的URI都是正确的。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~
您的示例代码突出显示了Path的 toUri()返回的值与文件的 toURI()方法之间的差异。在Win10机器上打印这些值显示:
path.toUri()=>文件:/// d:/NetBeansProjects/MiscTests/./ 强>
file.toUri()=>文件:/ d:/的NetBeansProjects / MiscTests /./强>
Linux上的结果类似:
path.toUri()=>文件:///home/johndoe/IdeaProjects/TestUri/./ 强>
file.toUri()=>文件:/家庭/输入johndoe / IdeaProjects / TestUri /./强>
所以唯一的区别是" 文件"" 文件:"在URI中。
通过链接,RFC 8089的附录B确认两种形式都是有效的URI:
具有空权限的本地文件的传统文件URI。 这是目前使用的最常用格式。例如:
* "file:///path/to/file"
o没有权限的本地文件的最小表示形式 领域 以斜杠开头的绝对路径" /"。例如:
* "file:/path/to/file"
进一步确认两个URI表单都有效,可以在浏览器中输入任一个以显示目录的内容。但是,有几点值得注意:
Brave是唯一不接受URI的单斜杠形式的浏览器(由File.toURI()。toString()提供)。
所有浏览器都接受了URI的三次斜杠形式(由File.toPath()。toUri()。toString())给出。
如果我在浏览器的地址栏中输入带有单斜杠的URI,则会转换为三斜杠。
奇怪的是,Chrome和Firefox都会接受URI中的任意数量的斜杠(例如file://///////// D:/ NetBeansProjects / MiscTests /),并且仍会显示目录