java file tourl_Java:Windows文件上的File.toURI()。toURL()

The system I'm running on is Windows XP, with JRE 1.6.

我正在運行的系統是Windows XP,JRE 1.6。

I do this :

我這樣做:

public static void main(String[] args) {

try {

System.out.println(new File("C:\\test a.xml").toURI().toURL());

} catch (Exception e) {

e.printStackTrace();

}

}

and I get this : file:/C:/test%20a.xml

我得到了這個:file:/ C:/test%20a.xml

How come the given URL doesn't have two slashes before the C: ? I expected file://C:.... Is it normal behaviour?

為什么給定的URL在C之前沒有兩個斜杠?我期待file:// C:....這是正常的行為嗎?

EDIT :

From Java source code : java.net.URLStreamHandler.toExternalForm(URL)

來自Java源代碼:java.net.URLStreamHandler.toExternalForm(URL)

result.append(":");

if (u.getAuthority() != null && u.getAuthority().length() > 0) {

result.append("//");

result.append(u.getAuthority());

}

It seems that the Authority part of a file URL is null or empty, and thus the double slash is skipped. So what is the authority part of a URL and is it really absent from the file protocol?

似乎文件URL的Authority部分為null或為空,因此跳過雙斜杠。那么URL的權限部分是什么?它是否真的不存在於文件協議中?

3 个解决方案

#1

That's an interesting question.

這是一個有趣的問題。

First things first: I get the same results on JRE6. I even get that when I lop off the toURL() part.

首先要做的是:我在JRE6上獲得了相同的結果。當我丟掉toURL()部分時,我甚至會得到它。

RFC2396 does not actually require two slashes. According to section 3:

RFC2396實際上不需要兩個斜杠。根據第3節:

The URI syntax is dependent upon the scheme. In general, absolute URI are written as follows:

URI語法取決於方案。通常,絕對URI編寫如下:

:

Having said that, RFC2396 has been superseded by RFC3986, which states

話雖如此,RFC2396已被RFC3986取代,后者表示

The generic URI syntax consists of a hierarchical sequence of omponents referred to as the scheme, authority, path, query, and fragment.

通用URI語法由一系列的omponents組成,稱為方案,權限,路徑,查詢和片段。

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part = "//" authority path-abempty

/ path-absolute

/ path-rootless

/ path-empty

The scheme and path components are required, though the path may be empty (no characters). When authority is present, the path must either be empty or begin with a slash ("/") character. When authority is not present, the path cannot begin with two slash characters ("//"). These restrictions result in five different ABNF rules for a path (Section 3.3), only one of which will match any given URI reference.

方案和路徑組件是必需的,但路徑可能為空(無字符)。當存在權限時,路徑必須為空或以斜杠(“/”)字符開頭。當權限不存在時,路徑不能以兩個斜杠字符(“//”)開頭。這些限制導致路徑的五個不同的ABNF規則(第3.3節),其中只有一個匹配任何給定的URI引用。

So, there you go. Since file URIs have no authority segment, they're forbidden from starting with //.

所以,你去吧。由於文件URI沒有權限段,因此禁止它們以//開頭。

However, that RFC didn't come around until 2005, and Java references RFC2396, so I don't know why it's following this convention, as file URLs before the new RFC have always had two slashes.

但是,RFC直到2005年才出現,Java引用RFC2396,所以我不知道為什么它遵循這個約定,因為新RFC之前的文件URL總是有兩個斜杠。

#2

To answer why you can have both:

要回答為什么你可以兼得:

file:/path/file

file:///path/file

file://localhost/path/file

RFC3986(3.2.2。主機)聲明:

"If the URI scheme defines a default for host, then that default applies when the host subcomponent is undefined or when the registered name is empty (zero length). For example, the "file" URI scheme is defined so that no authority, an empty host, and "localhost" all mean the end-user's machine, whereas the "http" scheme considers a missing authority or empty host invalid."

“如果URI方案定義了主機的默認值,那么當主機子組件未定義或注冊名稱為空(零長度)時,該默認值適用。例如,定義”文件“URI方案,以便沒有權限,空主機,“localhost”都表示最終用戶的機器,而“http”方案認為缺少權限或空主機無效。“

So the "file" scheme translates file:///path/file to have a context of the end-user's machine even though the authority is an empty host.

因此,“文件”方案將file:/// path / file轉換為具有最終用戶機器的上下文,即使權限是空主機也是如此。

#3

As far as using it in a browser is concerned, it doesn't matter. I have typically seen file:///... but one, two or three '/' will all work. This makes me think (without looking at the java documentation) that it would be normal behavior.

就在瀏覽器中使用它而言,無關緊要。我通常看到file:/// ...但是一個,兩個或三個'/'都可以工作。這讓我覺得(不看java文檔)這將是正常的行為。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值