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 - 创建动态POJO并为其设置值

java - YouTube API v3中的NullPointerException

java - 来自 Firebase 的 dataSnapshot.getValue(MyClass.class) 在开发中工作正常,但在发布到 Play 商店后得到空值

java - DirectoryWalker筛选器文件夹中包含xml文件

mysql - 反正有使用MySQL的LOAD XML LOCAL INFILE吗

java - 整数/整数阵列存储在堆栈/堆上

java - 使用Maven时不包括Java外部 jar ?

android - 在android中从Facebook注销的代码

android - 当我不提前知道两个 View 的文本量时,如何对齐两个 EditText View ?

c - 打开多个文件并将它们存储在结构数组中