之前使用到了NIO的FileChannel做文件快速阅读,后来发现存在一个巨大的BUG,使用它会一直不释放文件句柄,即生成MD5的文件不能操作(移动或删除等),这个BUG网上吵得沸沸扬扬,至今没有解决,毕竟是SUN的BUG,解铃还需系铃人啊!咱只好乖乖的使用文件分块读取的方法,这种方式要求生成MD5和验证的时候得使用相同的缓存大小。 MD5Utils.java

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.nio.MappedByteBuffer;

import java.nio.channels.FileChannel;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

/**

*

* MD5工具类

*

*

* @author IceWee

* @date 2012-5-15

* @version 1.0

*/

public class MD5Utils {

private static final String ALGORIGTHM_MD5 = "MD5";

private static final int CACHE_SIZE = 2048;

/**

*

* 字符串生成MD5

*

*

* @param input

* @return

* @throws Exception

*/

public static String createMD5(String input) throws Exception {

return createMD5(input, null);

}

/**

*

* 字符串生成MD5

*

*

* @param input

* @param charset 编码(可选)

* @return

* @throws Exception

*/

public static String createMD5(String input, String charset) throws Exception {

byte[] data;

if (charset != null && !"".equals(charset)) {

data = input.getBytes(charset);

} else {

data = input.getBytes();

}

MessageDigest messageDigest = getMD5();

messageDigest.update(data);

return byteArrayToHexString(messageDigest.digest());

}

/**

*

* 生成文件MD5

*

*

* 该方法中使用的FileChannel存在一个巨大Bug,不释放文件句柄,即生成MD5的文件无法操作(移动或删除等)

* 该方法已被generateFileMD5取代

*

*

* @param filePath

* @return

* @throws Exception

*/

@Deprecated

public static String createFileMD5(String filePath) throws Exception {

String md5 = "";

File file = new File(filePath);

if (file.exists()) {

MessageDigest messageDigest = getMD5();

FileInputStream in = new FileInputStream(file);

FileChannel fileChannel = in.getChannel();

MappedByteBuffer byteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());

messageDigest.update(byteBuffer);

fileChannel.close();

in.close();

byte data[] = messageDigest.digest();

md5 = byteArrayToHexString(data);

}

return md5;

}

/**

*

* 生成文件MD5值

*

*

* 在进行文件校验时,文件读取的缓冲大小[CACHE_SIZE]需与该方法的一致,否则校验失败

*

*

* @param filePath

* @return

* @throws Exception

*/

public static String generateFileMD5(String filePath) throws Exception {

String md5 = "";

File file = new File(filePath);

if (file.exists()) {

MessageDigest messageDigest = getMD5();

InputStream in = new FileInputStream(file);

byte[] cache = new byte[CACHE_SIZE];

int nRead = 0;

while ((nRead = in.read(cache)) != -1) {

messageDigest.update(cache, 0, nRead);

}

in.close();

byte data[] = messageDigest.digest();

md5 = byteArrayToHexString(data);

}

return md5;

}

/**

*

* MD5摘要字节数组转换为16进制字符串

*

*

* @param data MD5摘要

* @return

*/

private static String byteArrayToHexString(byte[] data) {

// 用来将字节转换成 16 进制表示的字符

char hexDigits[] = {

'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'

};

// 每个字节用 16 进制表示的话,使用两个字符,所以表示成 16 进制需要 32 个字符

char arr[] = new char[16 * 2];

int k = 0; // 表示转换结果中对应的字符位置

// 从第一个字节开始,对 MD5 的每一个字节转换成 16 进制字符的转换

for (int i = 0; i < 16; i++) {

byte b = data[i]; // 取第 i 个字节

// 取字节中高 4 位的数字转换, >>>为逻辑右移,将符号位一起右移

arr[k++] = hexDigits[b >>> 4 & 0xf];

// 取字节中低 4 位的数字转换

arr[k++] = hexDigits[b & 0xf];

}

// 换后的结果转换为字符串

return new String(arr);

}

/**

*

* 获取MD5实例

*

*

* @return

* @throws NoSuchAlgorithmException

*/

private static MessageDigest getMD5() throws NoSuchAlgorithmException {

return MessageDigest.getInstance(ALGORIGTHM_MD5);

}

}

java md5验证工具_Java MD5校验工具类相关推荐

  1. java怎么验证格式_java如何校验json格式?

    package com.pbsage.ems.util; /** * 用于校验一个字符串是否是合法的JSON格式 * */ import java.text.CharacterIterator; im ...

  2. JAVA续本_Java业务校验工具实现(续集)

    一.背景 在前面的文章分享了一篇自已关于Java业务校验工具的实现Java业务校验工具实现,后面本着"不要重复造轮子"的原则,在网上搜索果然有志同道合的朋友已经实现过相同的功能框架 ...

  3. java正则表达式验证密码_java密码验证正则表达式校验

    ,正则表达式就是记录文本规则的代码. php密码验证正则表达式(8位长度限制) //密码验证 $password = "zongzi_Abc_oo13a2"; $n = preg_ ...

  4. java md5加密解密_java MD5加密解密 | 学步园

    package com.md5; /** * @author 作者 E-mail: chenshaohua2012@126.com * @version 创建时间:2012-11-6 下午3:29:4 ...

  5. java pattern详解_JAVA正则表达式:Pattern类与Matcher类详解

    以下我们就分别来看看这两个类: 一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1        ((A) ...

  6. java qq验证手机号码_java正则表达式表单验证类工具类(验证邮箱、手机号码、qq号码等)...

    package util; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 使用正则表达式进行表单验证 * ...

  7. java mysql工具_Java开源数据库管理工具

    SQuirreL SQL Client SQuirreL SQL Client 是一个用 Java 编写的程序,它允许您查看数据库的内容.发出 SQL 命令,以及如您将看到的,执行许多其他功能.构建该 ...

  8. java dump分析工具_Java 性能分析工具 (2):Java 内置监控工具

    引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...

  9. java properties文件 安全_java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] | 学步园...

    java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] 数据库读取工具类 package com.db; import java.sql.Connection; ...

最新文章

  1. Linux 用户和用户组配置说明
  2. linux执行加密的shell,Linux下Shell脚本文件的加密
  3. python回归方程系数计算_线性回归中的正规方程将θ系数返回为“NaN”
  4. android launcher 相关
  5. Dp问题:奶牛的聚会
  6. python网课期中答案_中国大学python编程答案网课MOOC考试期末慕课答案
  7. iOS App 崩溃报告符号化,.ips崩溃报告文件分析
  8. matlab相位相关图像配准,数字图像处理,相位相关图像配准
  9. Guitar Pro如何更改五线谱的符杆方向
  10. Java基础笔记-String类
  11. 通俗易懂的极限学习机(Extreme Learning Machine)
  12. Python爬虫_宅男福利?妹纸勿点__一蓑烟雨任平生
  13. Windows Server 2008 各版本介绍
  14. 汇编实现吃豆子小程序
  15. epubjs 在线阅读epub文件
  16. “人工智能”初创公司所面临的问题
  17. 1、RPC框架解析:开篇-什么是RPC?
  18. SDUT-2933-人活着系列之Streetlights (Kruskal)
  19. win10拒绝访问,需要安全选项卡如何操作?
  20. Web端算法部署+流媒体服务器算法部署+Flask+AI健身+Python-web实时检测效果显示

热门文章

  1. camunda 多租户
  2. Office2019专业版从下载到安装、使用
  3. Java微服务性能优化
  4. DAEMON Tools for mac 虚拟光驱 中文破解版下载
  5. VS Code 格式化 XML 文件的方法
  6. 基于智能融合配变终端的数字化台区技术应用(转载)
  7. 用歌词来记录此时的心情
  8. 保研复习整理——线性代数
  9. 全国农村固定观察点调查数据
  10. C++语言入门到精通