package pri.liyang.util;
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 根據文件生成MD5碼的工具類
* Author:李小白
*/
public class MD5Util {
/**
* 輔助方法
* @param filename
* @return
*/
private static byte[] createChecksum(String filename) {
InputStream fis = null;
try {
fis = new FileInputStream(filename);
byte[] buffer = new byte[1024];
MessageDigest complete = MessageDigest.getInstance("MD5");
int numRead = -1;
while ((numRead = fis.read(buffer)) != -1) {
complete.update(buffer, 0, numRead);
}
return complete.digest();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (null != fis) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 生成文件的MD5碼
* @param filePath 文件路徑
* @return 該文件的MD5碼
*/
private static String generateMD5(String filePath){
if (!new File(filePath).isFile()) {
System.err.println("Error: " + filePath
+ " is not a valid file.");
return null;
}
byte[] b = createChecksum(filePath);
if(null == b){
System.err.println(("Error:create md5 string failure!"));
return null;
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < b.length; i++) {
result.append(Integer.toString((b[i] & 0xff) + 0x100, 16)
.substring(1));
}
return result.toString();
}
/**
* 根據文件,在同一文件夾下生成相應的MD5文件,文件名相同,僅後綴名不同
* 比如文件爲helloworld.txt,生成MD5文件:helloworld.md5
* @param filePath 文件絕對路徑
*/
public static void generateMD5File(String filePath) throws IOException {
//獲得該文件實例
File file = new File(filePath);
//獲得該文件的MD5碼
String md5code = generateMD5(filePath);
//獲得該文件的文件夾路徑
String directoryPath = file.getParentFile().getAbsolutePath();
//生成該文件對應的MD5文件的文件名
String md5FileName = file.getName().substring(0, file.getName().lastIndexOf(".")) + ".md5";
//獲得該文件對應的MD5文件的絕對路徑
String md5FilePath = directoryPath + File.separator + md5FileName;
//生成MD5文件
File md5File = new File(md5FilePath);
if(!md5File.exists()){
md5File.createNewFile();
}
//文件寫入MD5碼的FileWriter類
FileWriter fileWriter = new FileWriter(md5File);
//將MD5碼寫入到MD5文件中
fileWriter.write(md5code);
//刷新流
fileWriter.flush();
//關流
fileWriter.close();
//打印提示信息
System.out.println("創建MD5文件成功:" + md5FilePath);
}
/**
* 輸入文件夾名稱,將該文件夾下所有的文件都生成同名的MD5文件
* @param directoryPath
*/
public static void generateMD5Files(String directoryPath) throws IOException {
//創建文件夾實例
File directory = new File(directoryPath);
//文件數組
File[] files = null;
if(directory.isDirectory()){
//獲得所有文件
files = directory.listFiles();
//分別爲每一個文件創建MD5文件
for(int i=0; i<files.length; i++){
generateMD5File(files[i].getAbsolutePath());
}
}else{
System.err.println("不是文件夾,請檢查路徑!");
return;
}
}
/**
* 測試類
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//輸入文件的絕對路徑,生成該文件同一文件夾下的相同文件名,後綴名爲.md5的文件
generateMD5File("C:\\Users\\李小白\\Desktop\\MD5\\helloworld.txt");
//輸入文件夾的絕對路徑,生成該文件夾下所有文件的MD5文件,該文件夾的文件數多一倍
generateMD5Files("C:\\Users\\李小白\\Desktop\\MD5");
}
}
本文鏈接:https://blog.csdn.net/weixin_39448458/article/details/81485522