前述和需求说明
和之前写的 Python:基于MD5的文件监听程序 是同样的功能,就不啰嗦了,就是又写了一个java版本的,可以移步 python 版本去看一下,整个的核心思路是一样的。代码已上传Github
类说明
FileMd5.java 利用md5生成文件hash值
fileWalk.java 只是一个文件遍历的demo,没有被其他类调用
myFileListener.java 主程序,监控文件夹,用到了文件遍历,调用了FileMd5中的FileMd5类
代码 FileMd5.java
1 package myFileListener; 2 3 import java.security.DigestInputStream; 4 import java.security.MessageDigest; 5 import java.security.NoSuchAlgorithmException; 6 import java.io.FileInputStream; 7 import java.io.IOException; 8 9 public class FileMd5 { 10 public static String fileMd5(String inputFile) throws IOException{ 11 12 int bufferSize = 1024*1024; //缓冲区大小 13 FileInputStream fileInputStream = null; 14 DigestInputStream digestInputStream = null; 15 16 try { 17 //获取MD5的实例 18 MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 19 20 fileInputStream = new FileInputStream(inputFile); 21 22 digestInputStream = new DigestInputStream(fileInputStream, messageDigest); //Creates a digest input stream, using the specified input stream and message digest. 23 24 byte[] buffer = new byte[bufferSize]; //设置缓冲区,辅助读取文件,避免文件过大,导致的IO开销 25 while(digestInputStream.read(buffer)>0); //read: updates the message digest return int 26 // 获取最终的MessageDigest 27 messageDigest = digestInputStream.getMessageDigest(); 28 // 拿到结果 return字节数组byte[] 包含16个元素 29 byte[] resultByteArray = messageDigest.digest(); 30 31 return byteArrayToHex(resultByteArray); //转换byte 为 string 类型 32 33 }catch(NoSuchAlgorithmException e) { 34 return null; 35 }finally { 36 try { 37 digestInputStream.close(); 38 fileInputStream.close(); 39 }catch (Exception e) { 40 System.out.println(e); 41 } 42 } 43 } 44 45 public static String byteArrayToHex(byte[] byteArray){ 46 char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 47 //一个字节是八位二进制 也就是2位十六进制字符 48 char[] resultCharArray = new char[byteArray.length*2]; 49 50 int index = 0; 51 for(byte b : byteArray){ 52 resultCharArray[index++] = hexDigits[b>>> 4 & 0xf]; 53 resultCharArray[index++] = hexDigits[b& 0xf]; 54 } 55 return new String(resultCharArray); 56 } 57 }