Java.Net.Uri 和 Android.Net.Uri 有什么区别

Whats the difference between Java.Net.Uri and Android.Net.Uri

我正在尝试从 file 对象中获取 Uri,如下所示:

File file = new File("/sdcard/MyFolder/MyFile.txt");
var androidUri = Android.Net.Uri.FromFile(file).ToString();
var javaUri = file.ToURI().ToString();

此 return 具有以下值:

androidUri = "file:///sdcard/MyFolder/MyFile.txt"
javaUri = "file:/sdcard/MyFolder/MyFile.txt"

所以我的问题是 Java.Net.UriAndroid.Net.Uri 之间的区别是什么?这两个值应该不同吗?什么时候用?

更新

我找到了两个文档页面 Java.Net.Uri and Android.Net.Uri 并且都说:

Builds and parses URI references which conform to RFC 2396.

因此这肯定是一个错误,他们应该 return 相同的字符串?

区别在于Android.Net.Uri是Google自己对RFC 2396的实现。

Android.Net.Uri 是不可变的,因此它是线程安全的。根据 comments in the source,它们的实现也更加宽容。因此,虽然 Java.Net.Uri 会抛出一个 Exception 你试图使用垃圾 URI,但 Android 实现只会 return 你一个带有垃圾的 Uri。

据我所知,Android.Net.Uri 只会抛出 NullPointerException 并且似乎没有其他异常。虽然 Java.Net.Uri 实现会抛出其他异常,例如 URISyntaxExceptionIllegalArgumentException

除此之外他们看起来很相似。

你得到的 Uri file:/sdcard/MyFolder/MyFile.txt 是有效的,当通过 java.net.URI 抛出它时,我得到以下信息:

java> String uri = "file:/sdcard/MyFolder/MyFile.txt";
java> import java.net.*
java> URI urr = new URI(uri);
java.net.URI urr = file:/sdcard/MyFolder/MyFile.txt
java> urr.getScheme();
java.lang.String res2 = "file"
java> urr.getPath();
java.lang.String res3 = "/sdcard/MyFolder/MyFile.txt"

这是一个实际的区别:

java.net.uri 支持 IPv4 和 IPv6 地址,而 android.net.uri only support IPv4.