Java从File或InputStream对象生成MD5摘要

在如何计算字符串的MD5摘要中?示例,您将看到如何从文本或字符串中计算MD5摘要。我们正在使用Apache Commons Codec库,并使用该DigestUtils.md5Hex()方法生成MD5。我在那篇文章中提到,我们还可以生成byte数组和InputStream对象的MD5摘要。在下面的示例中,您将看到一个示例,该示例生成文件中存储的文本数据的MD5摘要。

package org.nhooo.example.commons.codec;

import org.apache.commons.codec.digest.DigestUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class MD5FileHashDemo {
    public static void main(String[] args) {
        try {
            // 定义数据文件路径并创建一个InputStream对象。
            String data = System.getProperty("user.dir") + "/target/classes/data.txt" ;
            File file = new File(data);
            InputStream is = new FileInputStream(file);

            // 计算给定InputStream对象的MD5摘要。
            // 它将生成一个32个字符的十六进制字符串。
            String digest = DigestUtils.md5Hex(is);
            System.out.println("Digest = " + digest);
            System.out.println("Length = " + digest.length());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我们需要做的第一件事是将import语句添加到我们的类中以导入org.apache.commons.codec.digest.DigestUtils该类。该DigestUtils.md5Hex()方法定义为静态方法,因此DigestUtils在使用它之前不必创建类的实例。在创建InputStream对象之前,我们先定义数据文件的路径。我正在使用Apache Maven作为构建工具来创建代码片段。这就是为什么您看到我的路径的原因,该数据文件位于target / classes目录下,因为该目录是Maven放置编译后的类和资源文件的默认位置。接下来,我们从定义的路径创建File对象,然后创建File对象InputStream。

要生成摘要,我们可以简单地将InputStream对象的实例传递给DigestUtils.md5Hex()方法。如果在此过程中没有发生错误,我们将获得一个32字符的十六进制字符串作为输出。您要做的最后一件事是捕获方法抛出的可能异常。因此,我们添加了try-catch块并打印了错误堆栈跟踪,以帮助我们识别任何错误。

这是上面的代码片段生成的示例输出:

Digest = bafb2ec738d6de85170073c80a1008ad
Length = 32

Maven依赖

<!-- https://search.maven.org/remotecontent?filepath=commons-codec/commons-codec/1.12/commons-codec-1.12.jar -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.12</version>
</dependency>