我总是出现内存不足错误。
我的代码是:
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。
感谢
答案 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接口的类的问题。类只是对输入文件进行分块并逐个读取。