java 中,如何获取文件的MD5值呢?如何比较两个文件是否完全相同呢?
/** * Get MD5 of one file:hex string,test OK! * * @param file * @return */ public static String getFileMD5(File file) { if (!file.exists() || !file.isFile()) { return null; } MessageDigest digest = null; FileInputStream in = null; byte buffer[] = new byte[1024]; int len; try { digest = MessageDigest.getInstance("MD5"); in = new FileInputStream(file); while ((len = in.read(buffer, 0, 1024)) != NEGATIVE_ONE) { digest.update(buffer, 0, len); } in.close(); } catch (Exception e) { e.printStackTrace(); return null; } BigInteger bigInt = new BigInteger(1, digest.digest()); return bigInt.toString(16); } /*** * Get MD5 of one file!test ok! * * @param filepath * @return */ public static String getFileMD5(String filepath) { File file = new File(filepath); return getFileMD5(file); } /** * MD5 encrypt,test ok * * @param data * @return byte[] * @throws Exception */ public static byte[] encryptMD5(byte[] data) throws Exception { MessageDigest md5 = MessageDigest.getInstance(SystemUtil.KEY_MD5); md5.update(data); return md5.digest(); } public static byte[] encryptMD5(String data) throws Exception { return encryptMD5(data.getBytes(SystemUtil.CHARSET_ISO88591)); } /*** * compare two file by Md5 * * @param file1 * @param file2 * @return */ public static boolean isSameMd5(File file1,File file2){ String md5_1=SystemUtil.getFileMD5(file1); String md5_2=SystemUtil.getFileMD5(file2); return md5_1.equals(md5_2); } /*** * compare two file by Md5 * * @param filepath1 * @param filepath2 * @return */ public static boolean isSameMd5(String filepath1,String filepath2){ File file1=new File(filepath1); File file2=new File(filepath2); return isSameMd5(file1, file2); }
测试:
@Test public void test_getFileMD5() throws Exception{ String filepath="D:\\download\\3_尚学堂_UML概览.avi"; // File file=new File(filepath); String md5_1=SystemUtil.getFileMD5(filepath); System.out.println(md5_1); byte[]bytes=FileUtils.readBytes4file(filepath); byte[]md5=SystemUtil.encryptMD5(bytes); String md5_2=SystemUtil.toHexString(md5); System.out.println(md5_2); Assert.assertEquals(md5_1, md5_2); }