什么是Java.Net.Uri和Android.Net.Uri之间的区别

use*_*er1 22 java android uri xamarin.android xamarin

我试图Urifile像这样的对象得到一个:

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

这将返回以下值:

androidUri = "file:///sdcard/MyFolder/MyFile.txt"
javaUri = "file:/sdcard/MyFolder/MyFile.txt"
Run Code Online (Sandbox Code Playgroud)

所以我的问题是Java.Net.Uri,Android.Net.Uri这两个值之间的区别是什么?什么时候应该使用它们?

更新

我找到了两个文档页面Java.Net.UriAndroid.Net.Uri,他们都说:

构建和解析符合RFC 2396的 URI引用.

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

Che*_*ron 17

不同的是,Android.Net.Uri谷歌自己实施的RFC 2396.

Android.Net.Uri是不可变的,因此它是线程安全的.根据消息来源评论,他们的实施也更加宽容.因此,虽然Java.Net.Uri会抛出Exception你试图使用垃圾Uri,Android实现只会返回一个带有垃圾的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"
Run Code Online (Sandbox Code Playgroud)


Aey*_*oun 5

这是一个实际的区别:

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