【问题标题】:How to obtain correct URI of a local file?如何获取本地文件的正确 URI?
【发布时间】:2017-10-06 17:20:59
【问题描述】:

令我惊讶的是,在 jdk1.8.0_u144 上跟随 sn-p 打印 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)?

【问题讨论】:

  • File.toURI 是正确的。您可以在比较之前通过打印两个值来手动验证

标签: java file uri


【解决方案1】:

TLDR 版本:根据 RFC 8089,两种形式的 URI 都是正确的。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~

您的示例代码突出显示了 Path 的 toUri() 方法返回的值与 File 的 toURI() 方法返回的值之间的差异。在我的 Win10 机器上打印这些值显示:

path.toUri() => file:///D:/NetBeansProjects/MiscTests/./

file.toUri() => 文件:/D:/NetBeansProjects/MiscTests/./

Linux 上的结果类似:

path.toUri() => file:///home/johndoe/IdeaProjects/TestUri/./

file.toUri() => 文件:/home/johndoe/IdeaProjects/TestUri/./

所以唯一的区别是 URI 中“file:”后面的单斜杠或三斜杠。

从您的链接中,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/),并且仍然显示目录.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 2019-08-28
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2013-08-31
    • 2022-06-10
    相关资源
    最近更新 更多