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

48

我正在尝试从file对象中获取一个Uri,代码如下:

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引用。

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

Android开发:http://developer.android.com/reference/android/net/Uri.html - IntelliJ Amiya
类似的问题和答案在这里:https://dev59.com/rGcs5IYBdhLWcg3wrmDC - mayyo
3
@mayyo 我不明白那个问题和这个有什么关系?它只是讨论如何在两者之间转换,而不是它们的区别或应该如何使用。 - JKennedy
3个回答

30

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

Android.Net.Uri是不可变的,因此它是线程安全的。根据源代码中的注释,他们的实现更加宽容。所以当你尝试使用垃圾Uri时,Java.Net.Uri会抛出异常,而Android实现则会返回带有该垃圾内容的Uri。

据我所知,Android.Net.Uri只会抛出NullPointerException,似乎没有其他异常。而Java.Net.Uri实现会抛出其他异常,例如URISyntaxException和IllegalArgumentException等。

除此之外,它们似乎非常相似。

你得到的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"

10

以下是一个实际的区别:

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


0

另一个区别:

因此,如果您需要访问单独的查询参数,则使用 android.net.Uri 可能更方便。


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