java - 无法将文件放入 Java 字节数组

标签 java arrays hash guava checksum

我正在研究为给定文件生成校验和的 Java 代码。我正在使用 Gogole 的 Guava 库进行哈希处理。这是代码-

import com.google.common.hash.HashCode;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;

private HashCode doHash(File file) throws IOException {
    HashFunction hc = Hashing.murmur3_128();
    HashCode hsCode = hc.newHasher().putBytes(com.google.common.io.Files.asByteSource(file).read()).hash();
    return hsCode;
}

我为一个大小为 2.8GB 的​​文件运行了这段代码。它引发了以下错误 -

Exception in thread "main" java.lang.OutOfMemoryError: 2945332859 bytes is too large to fit in a byte array
    at com.google.common.io.ByteStreams.toByteArray(ByteStreams.java:232)
    at com.google.common.io.Files$FileByteSource.read(Files.java:154)
    ...

我可以在这里使用另一种数据结构吗?或者我应该寻找另一种策略将文件提供给哈希函数吗?

最佳答案

Guava 的 HashFunctions 不知道如何处理 ByteSources。但是 ByteSources 知道如何处理 HashFunctions。就那样做。

HashCode hsCode = Files.asByteSource(file).hash(hc);

关于java - 无法将文件放入 Java 字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51147242/

相关文章:

c# - for 循环中的每次迭代都会覆盖整个数组的值

java - 如何检查字节数组是否是有效的 UTF-8 字符串

javascript - 从末尾索引数组

java - 如何对字符串进行哈希处理,以便在任何地方修改字符时它几乎不会改变?

java - 如何将 java 用于每个带有自定义类的循环?

java - 如何在两个不同的类中设置和获取 Vector<Integer>?

java - (int & Integer.MAX_VALUE) % int 在 Java 中做什么?

java - maven-war-plugin 忽略用户属性 war.warName

vb.net - 字典访问 : composite key vs concatenated string index

ruby - 访问 ruby​​ 中嵌套哈希的元素