使用RandomAccessFile获取文件的MD5值
2016-01-15 20:13
411 查看
不同于使用FileInputStream和FileOutputStream读写文件,RadomAccessFile支持随机访问文件的方式。下面是官方的解释: Allows reading from and writing to a file in a random-access manner. This is different from the uni-directional sequential access that a {@link FileInputStream} or {@link FileOutputStream} provides. If the file is opened in read/write mode, write operations are available as well. The position of the next read or write operation can be moved forwards and backwards after every operation. 如何使用RandomAccessFile获取文件的MD5值: 1.通过MessageDigest.getInstance("MD5")得到MessageDigest实例。 2.创建RadomAccessFile的一个实例。 3.通过RadomAccessFile.read()读取文件,并调用MessageDigest.update()更新MessageDigest。 4.将MessageDigest转化为16进制的字符串(即MD5值)。 以下是相关代码:
public class MD5Util { private static final int STREAM_BUFFER_LENGTH = 1024; private static MessageDigest messagedigest = null; static{ try{ messagedigest = MessageDigest.getInstance("MD5"); }catch(NoSuchAlgorithmException e){ System.err.println(String.format("Initialization error , MessageDigest is not support %s : %s", MD5Util.class.getName(),e.getMessage())); } } /** *获取一般文件的md5值 */ public static String getFileMD5(String path){ File file = new File(path); if (!file.exists() || !file.isFile()) { return null; } byte[] buffer = new byte[STREAM_BUFFER_LENGTH * 8]; RandomAccessFile rf = null; int len; try{ rf = new RandomAccessFile(path,"r"); while ((len = rf.read(buffer)) != -1){ messagedigest.update(buffer,0,len); } }catch (IOException e){ System.err.println(String.format("Class %s File %s can not read : %s", MD5Util.class.getName(), file.getAbsolutePath(),e.getMessage())); }finally { if(rf != null){ try{ rf.close(); }catch (IOException e){ System.err.println(String.format("Class %s File %s's RandomAccessFile can not close : %s", MD5Util.class.getName(), file.getAbsolutePath(),e.getMessage())); } } } BigInteger integer = new BigInteger(1, messagedigest.digest()); return integer.toString(16); }
但是要计算上G文件的MD5时,计算时间大约要几秒,用户体验肯定不好。对此,可以通过计算大文件的几个特定部分来表示大文件的MD5值(但不是大文件的MD5值)。 相关代码如下:
public static String getSimpleMD5(String path) { File file = new File(path); if (!file.exists() || !file.isFile()) { return null; } int len; RandomAccessFile rf = null; byte[] buffer = new byte[STREAM_BUFFER_LENGTH]; try { rf = new RandomAccessFile(path, "r"); if (file.length() > STREAM_BUFFER_LENGTH * 3) { //开头读取一个KB rf.seek(0); rf.read(buffer); messagedigest.update(buffer); //文件中间开始读取一个KB rf.seek(file.length() / 2); rf.read(buffer); messagedigest.update(buffer); //文件结尾前读取一个KB rf.seek(file.length() - STREAM_BUFFER_LENGTH); rf.read(buffer); messagedigest.update(buffer); } else { while ((len = rf.read(buffer)) != -1) { messagedigest.update(buffer, 0, len); } } } catch (IOException e) { System.err.println(String.format("Class %s File %s can not read : %s",MD5Util.class.getName(), file.getAbsolutePath(), e.getMessage())); } finally { if (rf != null) { try { rf.close(); } catch (IOException e) { System.err.println(String.format("Class %s File %s's RandomAccessFile can not close : %s",MD5Util.class.getName(), file.getAbsolutePath(), e.getMessage())); } } } BigInteger integer = new BigInteger(1, messagedigest.digest()); return integer.toString(16); }
4000
相关文章推荐
- asp MD5加密方式使用建议
- 浅谈C#中Md5和Sha1两种加密方式
- 基于C#对用户密码使用MD5加密与解密
- Linux系统递归生成目录中文件的md5的方法
- 在C#中生成与PHP一样的MD5 Hash Code的方法
- asp.net实现md5加密
- Java Web开发之MD5加密用法分析
- C#计算字符串哈希值(MD5、SHA)的方法小结
- php 的加密函数 md5,crypt,base64_encode 等使用介绍
- PHP中MD5函数使用实例代码
- php md5下16位和32位的实现代码
- jquery插件开发之实现md5插件
- Java实现MD5加密的方法
- C#计算文件MD5校验的方法
- javascript实现base64 md5 sha1 密码加密
- 分享JavaScript与Java中MD5使用两个例子
- javascript客户端生成MD5值的函数代码
- c++实现MD5算法实现代码
- php验证是否是md5编码的简单代码
- 利用PHP脚本在Linux下用md5函数加密字符串的方法