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

标签 java android file-io out-of-memory

我正在尝试将一个大约 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/

相关文章:

java - JDialog : Making some portion transparent

java - arraylist java.util.ConcurrentModificationException 从其他类初始化

java - 查找大子串的字谜计数时出错

android - 我可以只为 Activity 中的一个 SearchView 更改为深色主题吗?

java - 如何获取文件的 base64?

java - JPA Repository : javax. persistence.NonUniqueResultException: 结果返回多个元素

android - 区分 Maps API v2 中的不同标记(唯一标识符)

java - 为 androidTest sourceSet 配置 res srcDirs

python - 分割所有空白后重写回文件?

java - android从2个不同的文件读取