java如何在安卓应用程序上读取大型Base64文件(150MB)?
我正在尝试在安卓应用程序上读取大小为(~ 150MB)
的大型base64
文本文件
该文件包含JSON字符串,我需要将其解码并转换为JSON对象,然后在应用程序中使用它。问题是我在尝试读取此数据时遇到异常Out of Memory
该应用程序需要脱机工作,因此我需要下载完整数据
代码如下:
String localPath = getApplicationContext().getFilesDir().getPath().toString() ;
String key = "dataFile.txt" ;
StringBuilder text = new StringBuilder();
File file=new File(localPath+"/"+ key);
byte fileContent[] = new byte[3000];
try ( FileInputStream fin = new FileInputStream(file)) {
while(fin.read(fileContent) >= 0) {
byte[] data = Base64.decode(fileContent, Base64.DEFAULT);
try {
text.append(new String(data, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
obj = new JSONObject(text.toString());
}catch (Exception e){
e.printStackTrace();
}
我怎样才能读这种文件
# 1 楼答案
您正试图通过读取文件、迭代文件并将每一行附加到
text
对象,将整个文件读取到text
对象中。您可以从text
对象中创建JSONObject
,该对象实际上只在最后一步中对应用程序有用在这里,当代码到达第
obj = new JSONObject(text.toString());
行时,您已经用输入文件的大小填充了堆,因为这个完整的文件以test
对象的形式存在于内存中。然后对这个text
对象进行JSONObject
您可以采取以下措施来消除此问题:
BufferedReader
分块读取文件(可选)。使用read()
可能有点慢,最好有一个缓冲区李>1000
或10000
的批处理方式放入text
对象李>text
中准备JSONObject
并将其附加到obj
李>text
对象,然后重复整个过程李>通过这样做,您只读取了内存中文件的一小部分,而且
text
对象充当缓冲区,只消耗了少量内存以下是示例代码段:
# 2 楼答案
您唯一的选择是使用
JSON streaming
并对您感兴趣的事件作出反应我在4.0设备上使用了上述代码,JSON文件大小为10 MB
另外,你需要先解码你原来的Base64文件。不确定是否可以在
java.io.Stream
内动态完成。在最坏的情况下,将Base64文件解压成一个简单的json,然后使用上面的json流代码