Java 为什么可以';我不能使用FileInputStream来馈送MessageDigest对象吗?

Java 为什么可以';我不能使用FileInputStream来馈送MessageDigest对象吗?,java,hash,fileinputstream,digest,Java,Hash,Fileinputstream,Digest,为什么我必须使用DigestInputStream而不是FileInputStream来获取文件摘要 我编写了一个程序,从FileInputStream读取int,将其转换为字节,并将其传递给MessageDigest对象的更新方法。但我怀疑它不能正常工作,因为它计算了一个非常大的文件实例的摘要。为什么不起作用 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOExcept

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

我编写了一个程序,从FileInputStream读取int,将其转换为字节,并将其传递给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
和两个
捕获,在循环之外。
您是否尝试过调试它以查看它是否读取了所有字节?您对“非常大的文件”的分类是什么?我想说O(1Gb)开始变大了……我试着调试,它在退出之前读取了大约12个字节。我不知道为什么。