- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 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
。
您可以采取以下措施来消除此问题:
BufferedReader
以 block 的形式读取文件(可选)。使用 read()
可能会有点慢,但最好有一个缓冲区。1000
或 10000
的批处理放入 text
对象中。text
中准备 JSONObject
并将其附加到 obj
。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/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
所以我正在开发一个黑 jack 程序,但我有点卡住了。我会警告大家,我对编程真的很陌生,而且,我正在项目中期......所以有一些松散的结局和未使用的变量,以及一些不必要的逻辑(用于测试),但这就是我
我正在尝试创建一个可用作 OpenGL 测试工具的示例程序。到目前为止,我的那个似乎可以工作,但似乎忽略了通过统一变量 MVPMatrix 传递的 MVP 矩阵。当我添加代码以读回制服并检查它是否确实
感谢您帮助我,这是有关我的代码的部分。 printf("Thank you, now please enter the logic gate"); scanf("%s", &C); if (C ==
public static void ejemplosString(String palabra){ char[] letras = palabra.toCharArray();
所以,我有一个 php 应用程序,通过 cgi 和 nginx 运行。我有一个 .jar 程序,用于在条形码打印机(Zebra)上打印条形码,猜猜看是什么!。 我的 php 应用程序使用 exec()
我遇到的唯一问题是 getAll() 方法,它似乎在 PersonnelController 类中的位置立即运行。我也曾在其他很多地方尝试过,但都没有成功。 setAll() 方法看起来不错,我已经测
我是一名优秀的程序员,十分优秀!