import java.io.File; |
import java.io.FileInputStream; |
import java.io.IOException; |
import java.nio.MappedByteBuffer; |
import java.nio.channels.FileChannel; |
import java.security.MessageDigest; |
import java.security.NoSuchAlgorithmException; |
/** |
* 获取文件md5值 |
* |
*/ |
public class FileMd5Utils { |
protected static char hexDigits[] = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , |
'7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' }; |
protected static MessageDigest messageDigest = null ; |
static { |
try { |
messageDigest = MessageDigest.getInstance( "MD5" ); |
} catch (NoSuchAlgorithmException e) { |
e.printStackTrace(); |
} |
} |
/** |
* 根据文件路径计算文件的MD5 |
* |
* @param fileName |
* @return |
* @throws IOException |
*/ |
public static String getFileMD5String(String fileName) throws IOException { |
File f = new File(fileName); |
return getFileMD5String(f); |
} |
/** |
* 根据文件对象计算文件的MD5 |
* |
* @param file |
* @return |
* @throws IOException |
*/ |
public static String getFileMD5String(File file) throws IOException { |
FileInputStream in = new FileInputStream(file); |
FileChannel ch = in.getChannel(); |
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0 , |
file.length()); |
messageDigest.update(byteBuffer); |
return bufferToHex(messageDigest.digest()); |
} |
private static String bufferToHex( byte bytes[]) { |
return bufferToHex(bytes, 0 , bytes.length); |
} |
private static String bufferToHex( byte bytes[], int m, int n) { |
StringBuffer stringbuffer = new StringBuffer( 2 * n); |
int k = m + n; |
for ( int l = m; l < k; l++) { |
appendHexPair(bytes[l], stringbuffer); |
} |
return stringbuffer.toString(); |
} |
private static void appendHexPair( byte bt, StringBuffer stringbuffer) { |
char c0 = hexDigits[(bt & 0xf0 ) >> 4 ]; |
char c1 = hexDigits[bt & 0xf ]; |
stringbuffer.append(c0); |
stringbuffer.append(c1); |
} |
/** |
* 测试方法 |
* |
* @param args |
* @throws IOException |
*/ |
public static void main(String[] args) throws IOException { |
String fileName = "C:\\test.txt" ; // 更改文件名不会导致文件md5值变化 |
System.out.println(getFileMD5String(fileName)); |
} |
} |