xamarin Java.Net.URI和Android.Net.URI之间有什么区别

9gm1akwq  于 2023-04-03  发布在  Java
关注(0)|答案(3)|浏览(135)

我尝试从一个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引用。
这是一个错误,他们应该返回相同的字符串?

utugiqy6

utugiqy61#

不同之处在于Android.Net.Uri是Google自己对RFC 2396的实现。
Android.Net.Uri是不可变的,因此它是线程安全的。根据comments in the source,它们的实现也更宽容。因此,当Java.Net.Uri试图使用垃圾Uri时,它会抛出Exception,而Android实现只会返回一个带有垃圾的Uri。
据我所知,Android.Net.Uri只会抛出NullPointerException,似乎没有其他异常。
否则它们看起来非常相似。
你得到的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"
dojqjjoe

dojqjjoe2#

这里有一个实际的区别:
uri支持IPv4和IPv6地址,而android.net.uri only support IPv4 .

r7xajy2e

r7xajy2e3#

另一个区别:

  • android.net.UrigetQueryParameter(String)(以及一些相关的方法)来获取单独的查询参数。
  • java.net.URI只有getRawQuery()getQuery()。这些方法返回整个查询字符串,例如foo=1&bar=2

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

相关问题