仅使用file://的Java URI

3
我想知道是否可能只使用file://创建URI?我尝试过但是得到了URISyntaxException。我的问题是为什么这个URL可以工作而URI不行?

2
可能是https://dev59.com/a3VC5IYBdhLWcg3w0EoD的重复问题,URI和URL有什么区别? - Suresh Atta
@Baadshah,我在那个链接中没有看到一个直截了当的答案。 - Duncan Jones
巴德沙,抱歉,但是这个链接没有让任何东西清晰起来。 我的问题是为什么 file:// 能与 URL 一起使用,但不能与 URI 一起使用。 - AnthonyC
1个回答

2
双斜杠//URI scheme的层次结构部分有特殊含义。
引用自wikipedia
层次结构部分旨在保持层次结构性质的标识信息。如果此部分以双斜杠(“//”)开头,则其后跟一个授权部分和路径。如果层次路径不以(“//”)开头,则仅包含路径。
URI中的hierarchical part以双斜杠//开头,如file://。在这种情况下,期望在可选的authority part之后是path
该语句:
URI uri = new URI("file://");

结果是
java.net.URISyntaxException: Expected authority at index 7: file://

由于传递的字符串违反了URI的规范, 因此出现了这个语句。
URL url = new URL("file://");

不会抛出异常,但在尝试打开输入流时会因未指定路径而失败,并显示“FileNotFoundException”错误信息。
如果不想指定“authority part”,则必须遵守规范,这意味着您可以将其留空并在“//”之后直接指定路径。
URI uri = new URI("file:///");

或者直接在URI字符串中不要放置//,直接从路径开始。
URI uri = new URI("file:/");

两者等效,将导致相同的URL。打开输入流并读取它只会打印您的根目录的列表。

A4L 谢谢!!!我现在明白了我的错误。 - AnthonyC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接