import org.apache.commons.io.IOUtils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashSet; import java.util.Set; public class HashBufferedInputStream extends BufferedInputStream { private final MessageDigest messageDigest; private static final Set<String> algorithms = new HashSet<>(); static { algorithms.add("MD5"); algorithms.add("SHA-1"); algorithms.add("SHA-256"); algorithms.add("SHA-512"); } /** * @param anIn * @throws NoSuchAlgorithmException */ public HashBufferedInputStream(final InputStream anIn, final String algorithm) throws NoSuchAlgorithmException { super(anIn); if (!algorithms.contains(algorithm)) { throw new RuntimeException("algorithm not support"); } messageDigest = MessageDigest.getInstance(algorithm); } /** * @param anIn * @param anSize * @throws NoSuchAlgorithmException */ public HashBufferedInputStream(final InputStream anIn, final int anSize, final String algorithm) throws NoSuchAlgorithmException { super(anIn, anSize); if (!algorithms.contains(algorithm)) { throw new RuntimeException("algorithm not support"); } messageDigest = MessageDigest.getInstance(algorithm); } @Override public int read(final byte[] anB) throws IOException { final int result = super.read(anB); if (result != -1) { messageDigest.update(anB, 0, result); } return result; } public String getHash() { final byte byteBuffer[] = messageDigest.digest(); final StringBuffer hexStr = new StringBuffer(); for (final byte element : byteBuffer) { final String hex = Integer.toHexString(0xff & element); if (hex.length() == 1) { hexStr.append('0'); } hexStr.append(hex); } return hexStr.toString(); } public static void main(final String[] args) throws NoSuchAlgorithmException, IOException { final File file = new File("/Users/xxxx/Downloads/10001 (5).doc"); try (final FileInputStream inputStream = new FileInputStream(file) ;final HashBufferedInputStream hashBufferedInputStream = new HashBufferedInputStream(inputStream, "MD5") ;final ByteArrayOutputStream output = new ByteArrayOutputStream() ;final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(output)) { IOUtils.copy(hashBufferedInputStream, bufferedOutputStream); System.out.println(hashBufferedInputStream.getHash()); } } }