gpt4 book ai didi

java.lang.OutOfMemoryError 在 android 中加密大文件

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

我正在尝试在 Android 中使用 AES 算法加密一个 23 MB 的文件。当文件大小约为 3-4 MB 时,代码可以正常工作。但是当我用一个 23 MB 的文件进行测试时,它给了我一个 java.lang.OutOfMemoryError

这是代码-

                 try{
SecretKeySpec skey = new SecretKeySpec(Hex.decodeHex(key.toCharArray()), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
output = cipher.doFinal(bFile);
String SD_CARD_PATH = Environment.getExternalStorageDirectory().toString();
FileOutputStream fileOuputStream = new FileOutputStream(SD_CARD_PATH+ "/" + "abcd.db");
fileOuputStream.write(output);
fileOuputStream.close();
//System.out.println(output);
}catch(Exception e){
System.out.println("Error: "+e);
}

我在行中收到此错误 - output = cipher.doFinal(bFile);还有其他方法吗?我该怎么办?

最佳答案

你有一个 OOME 因为 bFile 是一个数组,所以你可能在内存中有整个输入文件。 output 是另一个字节数组,因此您还将整个输出文件保存在 RAM 中。正如您所知,Android 应用程序的 Java 堆有一个最大大小(取决于设备,但常见的最小值为 16MB)。

这是“数组方法”的主要缺点之一。另一个是与数组缓冲区大小相关的填充问题。不幸的是,搜索引擎返回的大多数代码示例都显示了数组方法,因此在 SO 中有很多关于相同问题的问题。

您应该知道还有一种替代流方法。事实证明它更容易、更安全。它涉及使用 CipherInputStream(用于解密)和 CipherOutputStream 用于加密。示例:

    InputStream is = new FileInputStream(...); //Input stream

SecretKeySpec skey = new SecretKeySpec(Hex.decodeHex(key.toCharArray()), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
FileOutputStream fileOuputStream = new FileOutputStream(SD_CARD_PATH+ "/" + "abcd.db");
CipherOutputStream cos = new CipherOutputStream(fileOuputStream, cipher);

//Now read from input and write to output using your favorite utilities library
//Guava and Apache Commons IO are good examples.
FooUtils.copy(is, cos);
//Remember to close streams if the previous call didn't (preferably in a finally block)

关于java.lang.OutOfMemoryError 在 android 中加密大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21281269/

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