/**
* 获取文件的MD5值
*
* @param filePath
* 文件路径
* @return
*/
public String encodeFileByMD5(String filePath) {
String md5Str = "";
FileInputStream fis = null;
DigestInputStream dis = null;
try {
File file = new File(filePath);
if (file != null && file.exists()) {
MessageDigest md = MessageDigest.getInstance("MD5");
fis = new FileInputStream(file);
// 使用指定的输入流和消息摘要创建一个摘要输入流
dis = new DigestInputStream(fis, md);
byte[] b = new byte[128 * 1024];
// 读至文件结束;读取字节并更新消息摘要
// 在与此流关联的消息摘要上调用 update,将读取的字节传递给该方法
while (dis.read(b) != -1)
;
// 返回与此流关联的消息摘要
md = dis.getMessageDigest();
byte[] bytes = md.digest();
md5Str = this.byteArrayToHex(bytes);
} else {
System.out.println("file is null or not exist");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
if (dis != null) {
dis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return md5Str;
}
/**
* 将字节数组转为十六进制字符串
*
* @param bytes
* @return 返回16进制字符串
*/
public String byteArrayToHex(byte[] bytes) {
// 字符数组,用来存放十六进制字符
char[] hexReferChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F' };
// 一个字节占8位,一个十六进制字符占4位;十六进制字符数组的长度为字节数组长度的两倍
char[] hexChars = new char[bytes.length * 2];
int index = 0;
for (byte b : bytes) {
// 取字节的高4位
hexChars[index++] = hexReferChars[b >>> 4 & 0xf];
// 取字节的低4位
hexChars[index++] = hexReferChars[b & 0xf];
}
return new String(hexChars);
}