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


我想要一个 Uri 从一个 file 像这样的对象:

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.Uri 和 Android.Net.Uri 这两个值应该是不同的吗?什么时候应该使用它们?

更新

我找到了两个文档页面 java.net.URI中 和 Android.Net.Uri 并且都说:

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

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


8416
2017-07-22 10:41


起源

对于Android developer.android.com/reference/android/net/Uri.html - IntelliJ Amiya
类似的问答在这里: stackoverflow.com/questions/12649530/... - mayyo
@mayyo我不明白这个问题是如何相关的?它谈到了两者之间的转换,而不是它们应该被使用的时间 - user1


答案:


不同之处在于 Android.Net.Uri 是谷歌自己的RFC 2396实现。

Android.Net.Uri 是不可变的,因此它是线程安全的。据他们说,他们的实施也是如此 来源中的评论,更宽容。所以虽然 Java.Net.Uri 会抛出一个 Exception 你尝试使用垃圾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"

9
2017-07-23 13:03





这是一个实际的区别:

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


1
2018-04-21 15:24