相关文章推荐
耍酷的枕头  ·  jpa 批量入库 mysql ...·  3 月前    · 
阳刚的蚂蚁  ·  averageifs函数_百度百科·  1 年前    · 
深情的大蒜  ·  javascript - How to ...·  1 年前    · 

读取大的资产文件会产生内存不足的异常

0 人关注

我试图用InputStream读取一个资产文件,但它抛出了OutOfMemory异常,文件的大小是22mb(大约2200万字节!)。

This is the code I use

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){
5 个评论
但是,为什么你要把一个大文件完全放在内存中的一个字节缓冲区里?对我来说是没有意义的。而且还不够。在那之后,你会在那个字节缓冲区里创建一个字符串。因此,它将在内存中出现两次。不知道你为什么要这样做。
分开到几个文件
你可能无法在内存中容纳22MB的解析后的JSON。但是,如果你把 InputStream 传递给你的JSON解析器(Moshi、Gson、Jackson等),而不是试图自己把它读进去,你会有更好的运气。
就像@CommonsWare所说的那样,很多库都提供了使用流读取大型Json文件的选项,但是这也取决于你的Json结构,假设它是一个由很多类似的Json结构(对象)组成的大数组,那么就有可能使用这些库。
Use fromJson() on a Gson instance, wrapping your InputStream in an InputStreamReader . See github.com/google/gson/issues/187#issuecomment-83702155
java
android
out-of-memory
Arab Ware
Arab Ware
发布于 2022-08-19
2 个回答
Arab Ware
Arab Ware
发布于 2022-08-19
已采纳
0 人赞同

正如@CommonsWare所说,只是我必须使用这个

((java.io.Reader)(new java.io.InputStreamReader(ContextOfClass.getAssests().open("file name"))))

在我的gson json到listmap/liststring/等代码中

Sidharth Mudgil
Sidharth Mudgil
发布于 2022-08-19
0 人赞同

在你的清单文件中添加 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">