C# 在mono for android上从本地存储读取图像文件

C# 在mono for android上从本地存储读取图像文件,c#,android,xamarin.android,C#,Android,Xamarin.android,在mono for android中,我有一个将图像保存到本地存储的应用程序,用于缓存。当应用程序启动时,它会尝试从缓存加载图像,然后再尝试从web加载图像 我目前很难找到从本地存储读取和加载它们的好方法 我目前正在使用与此类似的东西: List<byte> byteList = new List<byte>(); using (System.IO.BinaryReader binaryReader = new System.IO.Bina

在mono for android中,我有一个将图像保存到本地存储的应用程序,用于缓存。当应用程序启动时,它会尝试从缓存加载图像,然后再尝试从web加载图像

我目前很难找到从本地存储读取和加载它们的好方法

我目前正在使用与此类似的东西:

        List<byte> byteList = new List<byte>();
        using (System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(context.OpenFileInput("filename.jpg")))
        {
            while (binaryReader.BaseStream.IsDataAvailable())
            {
                byteList.Add(binaryReader.ReadByte());
            }
        }
        return byteList.toArray();
List byteList=new List();
使用(System.IO.BinaryReader BinaryReader=new System.IO.BinaryReader(context.OpenFileInput(“filename.jpg”))
{
while(binaryReader.BaseStream.IsDataAvailable())
{
Add(binaryReader.ReadByte());
}
}
return byteList.toArray();
OpenFileInput()返回的流没有给出长度,因此每次只能读取一个字节。它也不能寻找。这似乎导致图像的加载速度比实际加载速度慢得多。相比之下,从Resrouce.Drawable加载图像几乎是瞬间的,但使用我的方法,加载8kb文件时会有一个非常明显的暂停,可能是300ms。这似乎是一项非常明显的任务,但我已经尝试了许多解决方案,并寻找了很多建议,但都没有用

我还注意到,当不在UI线程上运行时,这段代码似乎会因EndOfStream异常而崩溃


非常感谢您的帮助

您打算如何处理
列表
?您希望“从缓存加载图像”,但没有指定要将图像加载到的内容

如果要将它们加载到中,可以使用:

这将删除
列表
中间层

如果您确实需要所有字节(无论出于何种原因),您可以依赖以下事实:
System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)
与相同,这就是
context.OpenFileInput()
将使用的内容,允许:

byte[] bytes = System.IO.File.ReadAllBytes(
        Path.Combine (
            System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
            "filename.jpg"));
但是,如果这确实是一个缓存,则应该使用而不是
Context.FilesDir
,后者返回:


Bitmap Bitmap=BitmapFactory.DecodeStream(context.OpenFileInput(“filename.jpg”)我的上帝。。。只需直接从文件流加载图像就可以了。我觉得有必要首先将所有内容加载到字节数组中,而实际上我没有必要这样做。谢谢,这完美地解决了我的问题。您能告诉我如何从
System.Environment.SpecialFolder.Personal
文件夹的子文件夹加载图像吗?
byte[] bytes = System.IO.File.ReadAllBytes(
        Path.Combine (
            System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
            "filename.jpg"));
byte[] cachedBytes = System.IO.File.ReadAllBytes(
        Path.Combine(System.IO.Path.GetTempPath(), "filename.jpg"));