java - 使用 apache io utils 将文件读取到字节数组时出现内存不足错误

标签 java out-of-memory bouncycastle

我创建了一个类来使用 apache file utils 和 bouncy caSTLe 生成文件的校验和来生成校验和。我已经使用 apache 的 - IOUtils 读取了给定的文件,并且使用了 bouncy caSTLe 的 - bcprov 来生成校验和。

我使用的代码如下:

byte[] digest = null;
String result = "";

SHA1.Digest sha1 = new SHA1.Digest();
sha1.update(IOUtils.toByteArray(new FileInputStream(file)));
digest = sha1.digest();

for (int i = 0; i < digest.length; i++)
{
     result += Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1);
}

当我尝试读取大文件(即大约 80MB 文件)时,出现内存空间不足错误,如下所示

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at org.apache.commons.io.output.ByteArrayOutputStream.toByteArray(ByteAr rayOutputStream.java:322)
        at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:463)
        at com.test.hashgenerator.HashGenerator.getSHA1CheckSum(HashGe nerator.java:230)
        at com.test.hashgenerator.HashGenerator.main(HashGenerator.jav a:319)

我需要增强我的代码吗?任何帮助将不胜感激。

最佳答案

您的代码崩溃正是因为 IOUtils.toByteArray(new FileInputStream(file)),SHA 并不重要。

有关详细信息,请参阅以下示例:Most Robust way of reading a file or stream using Java (To prevent DoS attacks)

感谢 @SlipperySeal 和以下内容,此代码在 200 MB 文件上运行良好: Java: How to create SHA-1 for a file?

public byte[] createSha1(File file) throws Exception  {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
InputStream fis = new FileInputStream(file);
int n = 0;
byte[] buffer = new byte[8192];
while (n != -1) {
    n = fis.read(buffer);
    if (n > 0) {
        digest.update(buffer, 0, n);
    }
}
return digest.digest();
}

关于java - 使用 apache io utils 将文件读取到字节数组时出现内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34035972/

相关文章:

android - 如何使用 LayerDrawable 解决 OutOfMemoryError

c# - 如何在 C# 中创建与 BouncyCaSTLe 的 TLS 连接?

java - 在 Java 应用程序中多次添加安全提供程序

java - 与 Oracle RECORD、TABLE 和 OBJECT 类型一起使用的 JDBC

java - 如何将泛型类型存储在缓存中以避免在检索时进行未经检查的强制转换?

java - tomcat 7 + freebsd 7.2(32 位)多线程应用程序抛出 OutOfMemoryError : could not create native thread

java - Java 中带有 bouncycaSTLe 的 PBKDF2

java Stream map和mapToObj的区别

java - 分割字符串的小问题

c# - 为什么 'Any CPU (prefer 32-bit)' 允许我在 .NET 4.5 下分配比 x86 更多的内存?