JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现。获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过MessageDigest类进行MD5加密,第三步转换成16进制的MD5码值。几种方法的不同点主要在第一步和第三步上。具体可以看下面的例子:

方法一、

private final static String[] strHex = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };public static String getMD5One(String path) {StringBuffer sb = new StringBuffer();try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] b = md.digest(FileUtils.readFileToByteArray(new File(path)));for (int i = 0; i < b.length; i++) {int d = b[i];if (d < 0) {d += 256;}int d1 = d / 16;int d2 = d % 16;sb.append(strHex[d1] + strHex[d2]);}} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return sb.toString();}

方法一是比较原始的一种实现方法,首先将文件一次性读入内存,然后通过MessageDigest进行MD5加密,最后再手动将其转换为16进制的MD5值。

方法二、

public static String getMD5Two(String path) {StringBuffer sb = new StringBuffer("");try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(FileUtils.readFileToByteArray(new File(path)));byte b[] = md.digest();int d;for (int i = 0; i < b.length; i++) {d = b[i];if (d < 0) {d = b[i] & 0xff;// 与上一行效果等同// i += 256;}if (d < 16)sb.append("0");sb.append(Integer.toHexString(d));}} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return sb.toString();}

方法二与方法一不同的地方主要是在步骤三,这里借助了Integer类的方法实现16进制的转换,比方法一更简洁一些。PS:JAVA中byte是有负数的,代码中&0xff的操作与计算机中数据存储的原理有关,即负数存储的是二进制的补码,有兴趣的童鞋可以挖一下,这里不展开说。

方法三、

public static String getMD5Three(String path) {BigInteger bi = null;try {byte[] buffer = new byte[8192];int len = 0;MessageDigest md = MessageDigest.getInstance("MD5");File f = new File(path);FileInputStream fis = new FileInputStream(f);while ((len = fis.read(buffer)) != -1) {md.update(buffer, 0, len);}fis.close();byte[] b = md.digest();bi = new BigInteger(1, b);} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return bi.toString(16);}

方法三与前面两个方法相比,在读入文件信息上有点不同。这里是分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。步骤三则是通过BigInteger类提供的方法进行16进制的转换,与方法二类似。

方法四、

DigestUtils.md5Hex(new FileInputStream(path));

方法四应该是最便捷的吧,哈哈,好东西要留在最后,如果你只需要使用标准的MD5,其实一行代码就够了,JAVA自带的commons-codec包就提供了获取16进制MD5值的方法。其底层实现上,也是分多次将一个文件读入,类似方法三。所以性能上也不错。

总结:其实方法都是类似的,推荐使用方法四,简洁且性能不错,当然,如果要做一些调整什么的,可以根据自己的需求进行方法的选择。

PS:其实还有一个重点,就是如何知道自己生成的MD5值是否正确呢?

方法很多,其实有一个挺简单的方法,不需要另外安装什么软件。使用windows自带的命令即可:certutil -hashfile [文件路径] MD5,例子如下:
  cmd 输入 powershell 切入到powershell面板
  ertutil -hashfile “./xxx.txt” MD5
  MD5需大写

JAVA中获取文件MD5值的四种方法相关推荐

  1. php页面文件后缀名,PHP中获取文件扩展名的N种方法

    PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法: function get_extension($file) { substr(strrchr($file, '. ...

  2. PHP中获取文件扩展名的N种方法

    PHP中获取文件扩展名的N种方法   从网上收罗的,基本上就以下这几种方式:      第1种方法:  function get_extension($file)  {  substr(strrchr ...

  3. xlsx表格怎么筛选重复数据_excel表格如何筛选重复数据 在Excel表格的两列数据中提取不重复值的四种方法...

    excel表格如何筛选重复数据 在Excel表格的两列数据中提取不重复值的四种方法,最近到了季度汇报的时候,掌握一手excel技能在此刻显得多么重要,为了是你的excel看起来更高大上,今天教大家设置 ...

  4. finfoopen需要什么扩展 php_php获取文件mime类型的四种方法

    何为MIME类型,它是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开. 多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式. ...

  5. java中得到文件MIME类型的几种方法(转)

    本文转载自:http://hotsunshine.iteye.com/blog/857485 使用 javax.activation.MimetypesFileTypeMap 需要引入activati ...

  6. html页面获取元素,JavaScript中获取HTML元素值的三种方法

    JavaScript中取得元素的方法有三种:分别是: 1.getElementById() 方法:通过id取得HTML元素. 2.getElementsByName()方法:通过name取得元素,是一 ...

  7. Java中保留n位小数的四种方法

    package CodeJava_Leet;import java.math.BigDecimal; import java.text.DecimalFormat; import java.text. ...

  8. html获取data-*值,html5 获取和设置data-*属性值的四种方法讲解

    1.获取id的对象 2.需要获取的就是data-id 和 dtat-vice-id的值 一:getAttribute()方法 const getId = document.getElementById ...

  9. java输出值取后两位小数,java中取小数点后两位(四种步骤)

    java中取小数点后两位(四种方法) 一 java.text.DecimalFormat df = new java.text.DecimalFormat("#.##"); dou ...

最新文章

  1. XCode修改工程名注意
  2. 推荐系统——矩阵分解FM
  3. Node.js+windows
  4. python的__slots__
  5. 创建maven web项目无法创建sec目录
  6. UPUPW PHP环境集成包,增加多个PHP版本支持,可选择使用
  7. 【C#】反射与面向接口的架构
  8. VB 串口编程 开发心得
  9. Vue项目中安装axios
  10. hive desc table_name commet乱码问题解决
  11. 计算机与网络时间同步,电脑时间同步,教您怎么让电脑时间和网络时间同步
  12. 计算机推免资源(不定期更新)
  13. linux网卡驱动realtek,Linux系统Realtek网卡驱动安装
  14. word 参考文献插入整理
  15. Spring4 Spring MVC实战(一)——读《Spring in action》搭建最简单的MVC
  16. 第十一章 文件操作_C语言fscanf和fprintf函数的用法详解(格式化读写文件)
  17. 1.类加载:什么是类加载???什么是类加载器???类加载器有哪三种类型???如何获取类加载器???
  18. 【架构设计】作为架构师你应该掌握的画图技术
  19. 26.JavaScript对象和基础类型之间的转换、hint、Symbol.toPrimitive、toString、valueOf
  20. excel表格下拉选项怎么设置_让表格美观好看几个Excel设置技巧

热门文章

  1. 难受难受,真它吗的难受... ...
  2. 数据可视化总结——matplotlib、seaborn
  3. 大厂面试Redis:缓存雪崩、缓存穿透、缓存击穿
  4. 极限的四则运算和洛必达法则的使用条件
  5. 笔记-15 网络编程入门 UDP通信程序 TCP通信程序 练习
  6. 13.荔枝派 zero(全志V3S)-gadget Mass Storage虚拟U盘
  7. python开发的著名游戏制作人是_Python 曾经开发过哪些了不起的程序或游戏?
  8. 用C语言写一个简单的飞机大战游戏(用到easyx图形库)
  9. 白话讲解Dubbo服务
  10. 2021辽宁省大学生程序设计竞赛 题解