java - 为什么我不能使用 FileInputStream 来提供 MessageDigest 对象?

标签 java hash fileinputstream digest

为什么我必须使用 DigestInputStream 而不是 FileInputStream 来获取文件的摘要?

我编写了一个程序,它从 FileInputStream 读取整数,将它们转换为字节并将它们传递给 MessageDigest 对象的更新方法。但我怀疑它不能正常工作,因为它会计算一个非常大的文件的摘要。为什么它不起作用?

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public class DigestDemo {

    public static byte[] getSha1(String file) {
        FileInputStream fis = null;
        MessageDigest md = null;

        try {
            fis = new FileInputStream(file);
        } catch(FileNotFoundException exc) {
            System.out.println(exc);
        }

        try {
            md = MessageDigest.getInstance("SHA-1");
        } catch (NoSuchAlgorithmException exc) {
            System.out.println(exc);
        }

        byte b = 0;
        do {

            try {
                b = (byte) fis.read();
            } catch (IOException e) {
                System.out.println(e);
            }

            if (b != -1)
                md.update(b);

        } while(b != -1);

        return md.digest();

    }

    public static void writeBytes(byte[] a) {
        for (byte b : a) {
            System.out.printf("%x", b);
        }
    }

    public static void main(String[] args) {

        String file = "C:\\Users\\Mike\\Desktop\\test.txt";
        byte[] digest = getSha1(file);
        writeBytes(digest);

    }

}

最佳答案

需要将b的类型改为int,,并且需要在最后调用MessageDigest.doFinal()文件,但这是非常低效的。尝试从字节数组读取和更新。

这段代码中有太多的 try-catching。将其减少到循环外的一次 try 和两次 catchs

关于java - 为什么我不能使用 FileInputStream 来提供 MessageDigest 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29327080/

相关文章:

java - 创建对象: Exception Caught in onSaveCompleted

encryption - 从 MD5 哈希函数的特殊应用中恢复电子邮件地址

android - 如何将文件分配给 InputStream?

java - 创建和下载 Zip 文件 java

java - Ubuntu 上的 NetBeans 插件中缺少代号一

java - 在 Android 上接收广播消息

java - 有没有等同于 Play! 的桌面?框架?

c++ - boost::Program_options 如何在值中支持散列字符?

mysql - 退出内置 Coldfusion 函数

Python 使用 Fileinput 替换单词