gpt4 book ai didi

java - 如何在不出现内存不足错误的情况下将应用程序 Assets 文件夹中的大文件写入 SD 卡?

转载 作者:行者123 更新时间:2023-11-29 10:05:41 25 4
gpt4 key购买 nike

我正在尝试将一个大约 80 兆字节的文件从 Android 应用程序的 Assets 文件夹复制到 SD 卡。

该文件是另一个apk。由于各种原因,我必须这样做,不能简单地链接到在线 apk 或将其放在 Android 市场上。

该应用程序适用于较小的 apk,但对于这个较大的 apk,我遇到了内存不足错误。

我不确定这是如何工作的,但我假设我正在尝试将完整的 80 兆字节写入内存。

try {
int length = 0;
newFile.createNewFile();

InputStream inputStream = ctx.getAssets().open(
"myBigFile.apk");
FileOutputStream fOutputStream = new FileOutputStream(
newFile);
byte[] buffer = new byte[inputStream.available()];
while ((length = inputStream.read(buffer)) > 0) {
fOutputStream.write(buffer, 0, length);
}
fOutputStream.flush();
fOutputStream.close();
inputStream.close();
} catch (Exception ex) {
if (ODP_App.getInstance().isInDebugMode())
Log.e(TAG, ex.toString());
}

我发现这很有趣 - A question about an out of memory issue with Bitmaps

除非我误解了,否则在位图的情况下,似乎有一些方法可以使用 BitmapFactory.Options 来拆分流以减少内存使用。

这在我的场景中是否可行,或者是否有任何其他可能的解决方案?

最佳答案

诀窍不是尝试一次读取整个文件,而是分成小块读取并写入每个 block ,然后再将下一个 block 读入同一内存段。以下版本将以 1K block 读取它。这仅是示例 - 您需要确定正确的 block 大小。

try {
int length = 0;
newFile.createNewFile();

InputStream inputStream = ctx.getAssets().open(
"myBigFile.apk");
FileOutputStream fOutputStream = new FileOutputStream(
newFile);
//note the following line
byte[] buffer = new byte[1024];
while ((length = inputStream.read(buffer)) > 0) {
fOutputStream.write(buffer, 0, length);
}
fOutputStream.flush();
fOutputStream.close();
inputStream.close();
} catch (Exception ex) {
if (ODP_App.getInstance().isInDebugMode())
Log.e(TAG, ex.toString());
}

关于java - 如何在不出现内存不足错误的情况下将应用程序 Assets 文件夹中的大文件写入 SD 卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8820837/

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