http://www.iteye.com/topic/1127319

前天第一次发表博客到论坛,关于Java文件监控一文,帖子地址在:http://www.iteye.com/topic/1127281

评论的朋友很多,下载代码的朋友很不少,感谢在论坛上看我帖子的朋友,还有回复评论的朋友,给我提供建议的朋友。

从这些建议中,虽然语言简短,但是却有的是一语中的,这里说一下一下关于帖子的代码中HashFile中的MD5文件校验算法,

该算法是使用Java自带的MessageDigest类,测试结果,获取一个2G文件的MD5码,耗时 971秒,这效率太给力了,可以用坑爹来形容,所以用MD5文件校验码来判断文件是否被修改,对于小文件来说可能还合适,要是对大文件来说,好吧,撞墙死了算了!

HashFile中的代码是这样子的:

import java.io.FileInputStream;

import java.io.InputStream;

import java.security.MessageDigest;

public class HashFile {

/**

* @param args

*/

public static char[] hexChar = { '0', '1', '2', '3', '4', '5', '6', '7',

'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

public static String getHash(String fileName, String hashType)

throws Exception {

InputStream fis;

fis = new FileInputStream(fileName);

byte[] buffer = new byte[1024];

MessageDigest md5 = MessageDigest.getInstance(hashType);

int numRead = 0;

while ((numRead = fis.read(buffer)) > 0) {

md5.update(buffer, 0, numRead);

}

fis.close();

return toHexString(md5.digest());

}

public static String toHexString(byte[] b) {

StringBuilder sb = new StringBuilder(b.length * 2);

for (int i = 0; i < b.length; i++) {

sb.append(hexChar[(b[i] & 0xf0) >>> 4]);

sb.append(hexChar[b[i] & 0x0f]);

}

return sb.toString();

}

}

测试结果:

真给力啊,超过2G,效率变成这样 !

好吧,自带的MD5算法,上当了,对于检查文件是否更新这个问题来说,现在我使用的解决办法是File 类的lastModified方法,代码这样

通过比较文件的最后修改时间来判断文件是否更新,对大文件也轻松拿下,

测试结果是这样:

当然针对不同问题肯定是有不同的解决办法

分析原来HashFile代码,获取MD5校验码的瓶颈是出现在

Java代码  

public static String getHash(String fileName, String hashType)

throws Exception {

InputStream fis;

fis = new FileInputStream(fileName);

byte[] buffer = new byte[1024];

MessageDigest md5 = MessageDigest.getInstance(hashType);

int numRead = 0;

while ((numRead = fis.read(buffer)) > 0) {  //瓶颈

md5.update(buffer, 0, numRead);

}

fis.close();

return toHexString(md5.digest());

}

public static String getHash(String fileName, String hashType)

throws Exception {

InputStream fis;

fis = new FileInputStream(fileName);

byte[] buffer = new byte[1024];

MessageDigest md5 = MessageDigest.getInstance(hashType);

int numRead = 0;

while ((numRead = fis.read(buffer)) > 0) { //瓶颈

md5.update(buffer, 0, numRead);

}

fis.close();

return toHexString(md5.digest());

}

在上面代码中,while循环N次,2G的文件,循环1024 * 1024  * 2 次,不给力!

chimer回复

来个nio的简单版,看你们老是怀疑java慢

C++ MD5工具验证结果:

File: K:\Games\World of Warcraft\Data\common.MPQ

Size: 2226587191 bytes

Modified: 2008年11月19日 星期三, 12:57:24

MD5: CD9F9C5523F3BA3866B81CCC74ED6476

java运行结果,毫秒

耗时:12672,cd9f9c5523f3ba3866b81ccc74ed6476

核心代码

String hashType = "MD5";

FileInputStream fStream = null;

try {

MessageDigest md5 = MessageDigest.getInstance(hashType);

fStream = new FileInputStream(

//"K:\\Games\\World of Warcraft\\Scan.dll");

//"K:\\Games\\World of Warcraft\\Data\\patch-3.MPQ");

"K:\\Games\\World of Warcraft\\Data\\common.MPQ");

FileChannel fChannel = fStream.getChannel();

ByteBuffer buffer = ByteBuffer.allocate(8*1024);

long s = System.currentTimeMillis();

for ( int count = fChannel.read( buffer ); count !=-1 ; count = fChannel.read( buffer )

) {

buffer.flip();

md5.update( buffer );

if( !buffer.hasRemaining() ){

//System.out.println("count:"+count);

buffer.clear();

}

}

s = System.currentTimeMillis() - s;

System.out.println( "耗时:"+s+","+getString( md5.digest() ) );

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

if( fStream!=null )

fStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

java 文件md5校验_Java 自带MD5 校验文件相关推荐

  1. win7搜索文件怎么搜索文件名中带圆括号的文件?

    win7搜索文件怎么搜索文件名中带圆括号的文件? System.FileName:~="(" 这样就行. 括号上加个引号 ~= 是包含的意思, ~< 是以什么为开头, = 是 ...

  2. java产生字符函数_java生成字符串md5函数类(javaSE)

    //实现生成MD5值 import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.B ...

  3. java md5 密钥_java代码实现MD5加密及验证方法

    MD5加密 在我们的程序中,不管是什么,都会有安全问题,今天就说的是MD5加密的方法 MD5是哈希算法,也就是 从明文A到密文B很容易,但是从密文B到明文A几乎不可能 也就是说,给你密文,是几乎无法通 ...

  4. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  5. java性能检测工具_Java自带的性能监测工具之jmap

    本文继续介绍Java自带的性能监测工具,本文使用jmap工具来玩~ jmap (Java Memory Map) 命令可以生成Java应用程序的堆快照和对象统计信息,对生成的堆快照进行分析,可以分析堆 ...

  6. java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】

    本文实例讲述了java实现切割wav音频文件的方法.分享给大家供大家参考,具体如下: import it.sauronsoftware.jave.Encoder; import it.sauronso ...

  7. java opencv 读取视频_java使用OpenCV从视频文件中获取帧

    本文实例为大家分享了java使用OpenCV从视频文件中获取帧的具体代码,供大家参考,具体内容如下 实现功能:使用Java获取mp4.mov.avi等视频文件中的图像帧,每秒获取一帧图像,并保存 环境 ...

  8. java+txt+词语+次数_Java练习2--读取txt文件统计考勤次数并写入一个txt文件中

    Java练习2--读取txt文件统计考勤次数并写入一个txt文件中 Java练习2--读取txt文件统计考勤次数并写入一个txt文件中 面向对象的小练习: 文件attendance.txt中的数据为本 ...

  9. java 注解校验_Java开发编写自定义校验注解和校验器

    自定义校验 1).编写一个自定义的校验注解 2).编写一个自定义的校验器 ConstraintValidator 3).关联自定义的校验器和自定义的校验注解 * @Documented * @Cons ...

  10. java文件tree目录_java 遍历目录,操作文件 tree命令

    用tree命令显示目录.文件结构 有时候我们想了解一个文件夹或者驱动器根目录下的所有文件,并希望它以资源管理器的树形视图方式显示文件结构.可以在"命令提示符"窗口中输入" ...

最新文章

  1. 树莓派4B Ubuntu18 vnc开机自启动
  2. LNMP - Warning: require(): open_basedir restriction in effect错误解决方法
  3. linux 多进程 多线程的选择
  4. 怎样学会科学的调研并启动一个项目
  5. Scrum sprint plan中规模估算的常见方式
  6. uboot阅读笔记之cpu工作模式(SVC32)
  7. 前端学习(3257):js高级教程(1)准备
  8. 9个提高代码运行效率的小技巧你知道几个?
  9. ZZULIOJ 1063:最大公约与最小公倍
  10. mysql数据库在哪里写语句_Mysql数据库操作语句
  11. 查看IIS哪个应用程序池占用CPU过高
  12. paip.c++ 宏的展开调试.
  13. 深入设计模式(二)——单例模式(Singleton Pattern)
  14. mc pe linux服务器地址,我的世界手机版服务器地址大全 我的世界PE服务器IP和端口一览...
  15. 【参赛作品94】21天openGauss学习之旅
  16. 深度优先搜索(DFS) 总结(算法+剪枝+优化总结)
  17. 阿里云+Android Studio+sql数据库实现增改删查与云端登录数据交互
  18. 投身开源,需要持之以恒的热爱与贡献 —— Apache Spark Committer 姜逸坤
  19. 生命倒计时-倒数9116日
  20. 在windows和Deepin上安装Fedora33-KDE:一波三折、第九次成功的嘤嘤怪

热门文章

  1. sentaurus学习日记(二)--器件特性提取
  2. 设计图纸管理系统办公系统实现无纸化
  3. 计算机打印机无法打印,电脑打印机无法打印怎么办 打印机不能打印解决办法...
  4. matlab抛物柱面 y 2=2x,求椭圆抛物面2y2+x2=z与抛物柱面2-x2=z的交线关于xOy面的投影柱面和在xOy面上的投影曲线方程...
  5. C++控制台游戏-小镇物语正式版 V1.7.21BUG修复版【可存档!!!】
  6. 模糊c均值聚类算法原理详细讲解
  7. RabbitMQ安装及使用教程
  8. 一次监视雷达行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  9. Linux操作系统搭建本地源
  10. iOS及Mac开源项目和学习资料【超级全面】