如何获取本地文件的正确URI?

时间:2017-10-06 17:21:00

标签: java file uri

令我惊讶的是,关于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#toURIjava.nio.Path#toUri会返回不同的演示文稿。问题是,哪一个是正确的(根据RFC 8089)?

1 个答案:

答案 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 /),并且仍会显示目录