获取文件的哈希码是一项常见的编程任务。MD5 是一种非常流行和常用的哈希算法。使用 Java 可以轻松获取文件的 MD5 哈希码,如下面的代码所示:
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.security.MessageDigest;
public class MD5file {
public static String md5OfFile(File file) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
FileInputStream fs = new FileInputStream(file);
BufferedInputStream bs = new BufferedInputStream(fs);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bs.read(buffer, 0, buffer.length)) != -1) {
md.update(buffer, 0, bytesRead);
}
byte[] digest = md.digest();
StringBuilder sb = new StringBuilder();
for (byte bite : digest) {
sb.append(String.format("%02x", bite & 0xff));
}
return sb.toString();
}
public static void main(String[] args) {
File md5file = new File("f:\\Fedora-KDE-Live-x86_64-34-1.2.iso");
try {
String out = md5OfFile(md5file);
System.out.println(out);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面的代码做了几件事:
- 创建一个
MessageDigest
最终会创建 MD5 哈希码的对象 - 使用
FileInputStream
和BufferedInputStream
缓冲来自文件的输入 - 每读取 1024 个字节更新
MessageDigest
对象update()
- 使用
digest()
方法返回文件的MD5哈希码 - 将此 MD5 哈希码转换为十六进制格式
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5file2 {
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
File file = new File("f:\\Fedora-KDE-Live-x86_64-34-1.2.iso");
MessageDigest md = MessageDigest.getInstance("MD5");
FileInputStream fs = new FileInputStream(file);
BufferedInputStream bs = new BufferedInputStream(fs);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bs.read(buffer, 0, buffer.length)) != -1) {
md.update(buffer, 0, bytesRead);
}
byte[] digest = md.digest();
StringBuilder sb = new StringBuilder();
for (byte bite : digest) {
sb.append(String.format("%02x", bite & 0xff));
}
System.out.println(sb.toString());
}
}
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5file3 {
public static void main(String[] args) {
File file = new File("f:\\Fedora-KDE-Live-x86_64-34-1.2.iso");
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileInputStream fs = null;
try {
fs = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedInputStream bs = new BufferedInputStream(fs);
byte[] buffer = new byte[1024];
int bytesRead;
try {
while ((bytesRead = bs.read(buffer, 0, buffer.length)) != -1) {
md.update(buffer, 0, bytesRead);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] digest = md.digest();
StringBuilder sb = new StringBuilder();
for (byte bite : digest) {
sb.append(String.format("%02x", bite & 0xff));
}
System.out.println(sb.toString());
}
}