【问题标题】:Reading Big Assets File Throws OutofMemory Exception读取大资产文件引发 OutofMemory 异常
【发布时间】:2022-08-19 22:36:29
【问题描述】:

我正在尝试使用 InputStream 读取资产文件,但它抛出 OutOfMemory 异常,文件大小为 22 mb(约 2200 万字节!)

这是我使用的代码

try{
    java.io.InputStream is = MainActivity.this.getAssets().open(\"file.json\");
               int Si = is.available();
               byte[] Bu = new byte[Si];
               is.read(Bu);
               is.close();
               data = new String(Bu, \"UTF-8\");
}catch(Exception e){
     
}
  • 但是为什么要将一个大文件完全放在内存中的字节缓冲区中呢?对我来说很有意义。还不够:之后,您创建了一个用于该字节缓冲区的字符串。因此它将在内存中两次。想知道你为什么这样做。
  • 分成几个文件
  • 好吧,即使那样也不需要。也不将字节缓冲区转换为字符串。您的意思是 22 MB。不是 22 mb。
  • 您可能无法在内存中保存 22MB 的已解析 JSON。但是,如果您将InputStream 传递给您的 JSON 解析器(Moshi、Gson、Jackson 等),而不是尝试自己读取它,那么您的运气会更好。

标签: java android out-of-memory


【解决方案1】:

在清单文件中添加android:largeHeap="true"

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

参考这个answer

确保内存中没有数据的两个副本。您可以在开始创建新的 ArrayList 之前取消对旧 ArrayList 的引用,尽管您必须小心地这样做——首先调用 ArrayList.clear() 会更彻底。

【讨论】:

  • 我会试试这个,谢谢你的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多