我创建了一个类来使用 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/