Android打开大文件的最佳方式~3-6 mb - 内存不足

时间:2010-11-09 00:31:53

标签: android memory

我总是出现内存不足错误。

我的代码是:

public static String openAssetFile(Context ctx) {
BufferedReader br=new BufferedReader(new InputStreamReader(ctx.getResources().openRawResource(R.raw.allx)));
StringBuilder text = new StringBuilder();
try {
    String line;

    while ((line = br.readLine()) != null) {
        text.append(line);
        text.append('\n');
    }
}
catch (IOException e) {
    Log.e("IOErr", "IOErr");
}

return text.toString();
}

这对小文件有好处,但是当我想打开更大的文件时,我该怎么办?像3-6 mb。

感谢

2 个答案:

答案 0 :(得分:1)

您应用的其余部分使用了多少内存?您的应用最多可以使用16Mb(或更多,具体取决于设备),因此加载3Mb文件不会给您带来内存限制。

这么说,我记得你的应用包中包含的文件大小有限(~2Mb)。您可以做的是将文件拆分为受限制的较小文件,然后使用http://download.oracle.com/javase/1.4.2/docs/api/java/io/SequenceInputStream.html读取这些文件,就好像它们是一个文件一样。

或者,找到预处理和压缩数据的方法,这样就不会占用太多内存。

您的代码效率非常低。根据编写类似代码的经验,我猜测它需要大约20秒才能运行。它会产生大量垃圾,所有这些操作都需要时间。你是不是可以一次性直接读取所有数据而不对每个条目进行处理?例如您可以预处理数据,将其序列化为对象,然后在应用程序中取消序列化。

我已经开发了一个需要加载3Mb字典文件的应用程序,我的解决方案是将其预处理为我需要的优化数据结构(将空间要求降低到0.5Mb),然后串行化在启动时直接加载对象。

答案 1 :(得分:1)

解决方案取决于您正在阅读如此冗长的文本的目的。例如,在我的情况下,我在阅读足够大的文本以在多行TextView中显示它时遇到了同样的问题。我已经解决了开发我自己的实现CharSequence接口的类的问题。类只是对输入文件进行分块并逐个读取。