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

2022-09-01 00:40:22

我试图从这样的对象中获取一个:Urifile

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

这将返回以下值:

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

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

更新

我发现Java.Net.UriAndroid.Net.Uri这两个文档页面都说:

构建并解析符合 RFC 2396 的 URI 引用。

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


答案 1

不同之处在于,这是Google自己实现的RFC 2396。Android.Net.Uri

Android.Net.Uri是不可变的,因此它是线程安全的。根据消息来源的评论,它们的实施也更加宽容。因此,虽然会抛出你尝试使用垃圾Uri,但Android实现只会返回一个包含该垃圾的Uri。Java.Net.UriException

据我所知,只会抛出NullPointerException,似乎没有其他异常。虽然实现会引发其他异常,例如和Android.Net.UriJava.Net.UriURISyntaxExceptionIllegalArgumentException

否则,它们看起来非常相似。

你得到的Uri是有效的,当它通过时,我会得到以下结果:file:/sdcard/MyFolder/MyFile.txtjava.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"

答案 2

这里有一个实际的区别:

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


推荐