我想使用Java来获得文件的MD5校验和。我真的很惊讶,但我还没有找到任何东西,显示如何获得一个文件的MD5校验和。

这是怎么做到的?


当前回答

下面是一个方便的变体,它利用了Java 9中的InputStream.transferTo()和Java 11中的OutputStream.nullOutputStream()。它不需要外部库,也不需要将整个文件加载到内存中。

public static String hashFile(String algorithm, File f) throws IOException, NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance(algorithm);

    try(BufferedInputStream in = new BufferedInputStream((new FileInputStream(f)));
        DigestOutputStream out = new DigestOutputStream(OutputStream.nullOutputStream(), md)) {
        in.transferTo(out);
    }

    String fx = "%0" + (md.getDigestLength()*2) + "x";
    return String.format(fx, new BigInteger(1, md.digest()));
}

and

hashFile("SHA-512", Path.of("src", "test", "resources", "some.txt").toFile());

返回

"e30fa2784ba15be37833d569280e2163c6f106506dfb9b07dde67a24bfb90da65c661110cf2c5c6f71185754ee5ae3fd83a5465c92f72abd888b03187229da29"

其他回答

如果使用ANT进行构建,这非常简单。将以下内容添加到build.xml中:

<checksum file="${jarFile}" todir="${toDir}"/>

其中jarFile是要针对其生成MD5的JAR, toDir是要放置MD5文件的目录。

更多信息请点击这里。

下面是一个方便的变体,它利用了Java 9中的InputStream.transferTo()和Java 11中的OutputStream.nullOutputStream()。它不需要外部库,也不需要将整个文件加载到内存中。

public static String hashFile(String algorithm, File f) throws IOException, NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance(algorithm);

    try(BufferedInputStream in = new BufferedInputStream((new FileInputStream(f)));
        DigestOutputStream out = new DigestOutputStream(OutputStream.nullOutputStream(), md)) {
        in.transferTo(out);
    }

    String fx = "%0" + (md.getDigestLength()*2) + "x";
    return String.format(fx, new BigInteger(1, md.digest()));
}

and

hashFile("SHA-512", Path.of("src", "test", "resources", "some.txt").toFile());

返回

"e30fa2784ba15be37833d569280e2163c6f106506dfb9b07dde67a24bfb90da65c661110cf2c5c6f71185754ee5ae3fd83a5465c92f72abd888b03187229da29"
public static void main(String[] args) throws Exception {
    MessageDigest md = MessageDigest.getInstance("MD5");
    FileInputStream fis = new FileInputStream("c:\\apache\\cxf.jar");

    byte[] dataBytes = new byte[1024];

    int nread = 0;
    while ((nread = fis.read(dataBytes)) != -1) {
        md.update(dataBytes, 0, nread);
    };
    byte[] mdbytes = md.digest();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < mdbytes.length; i++) {
        sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
    }
    System.out.println("Digest(in hex format):: " + sb.toString());
}

或者你可以得到更多的信息 http://www.asjava.com/core-java/java-md5-example/

使用Apache Commons Codec库中的DigestUtils:

try (InputStream is = Files.newInputStream(Paths.get("file.zip"))) {
    String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(is);
}

好的。对于那些已经有Spring和Apache Commons依赖关系或计划添加它的人,我必须添加。

DigestUtils.md5DigestAsHex(FileUtils.readFileToByteArray(file))

对于和Apache共享的唯一选项(credit @duleshi):

DigestUtils.md5Hex(FileUtils.readFileToByteArray(file))

希望这能帮助到一些人。