Util: Java生成文件的md5文件方法的代码

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");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值