gpt4 book ai didi

java - 如何在 Android 应用程序上读取大型 Base64 文件(150MB)?

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:00 26 4
gpt4 key购买 nike

我正在尝试在 Android 应用程序上读取大小为 (~ 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();
}

如何读取这种文件?

最佳答案

您正在尝试通过读取文件、迭代它并将每一行附加到 text 来将整个文件读入 text 对象。您从 text 对象创建 JSONObject,它实际上仅在最后一步对您的应用程序有用。

在这里,当您的代码到达 obj = new JSONObject(text.toString()); 行时,您已经用几乎与输入文件大小差不多的堆填满了这个完整的文件以 test 对象的形式存在于内存中。然后,您创建此 text 对象的 JSONObject

您可以采取以下措施来消除此问题:

  1. 使用BufferedReader 以 block 的形式读取文件(可选)。使用 read() 可能会有点慢,但最好有一个缓冲区。
  2. 迭代文件并将条目以 100010000 的批处理放入 text 对象中。
  3. text 中准备 JSONObject 并将其附加到 obj
  4. 在处理下一批之前清除text对象,然后重复整个过程。

通过这样做,您只读取内存中文件的一小部分,而且 text 对象充当缓冲区,仅消耗少量内存。

这是示例代码 fragment :

int counter = 0;
String temp = null;
final int BATCH_SIZE = 1000;
try (BufferedReader br = new BufferedReader(new FileReader(path)) {

while ((temp = br.readLine()) != null) {
text.append(temp);
++counter;

/* Process In Batches */
if(counter % BATCH_SIZE == 0) {
/* Prepare & Append JSON Objects */
obj = prepareAppendJSON(text.toString(), obj);
/* Clear text */
text.setLength(0);
}
}

/* Last Iteration */
obj = prepareAppendJSON(text, obj);
text = new StringBuilder();

} catch (IOException ex) {
ex.printStackTrace();
}

关于java - 如何在 Android 应用程序上读取大型 Base64 文件(150MB)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35827156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com