在昨天写的《JAVA并发处理大文件切分》一文中提到了获取文件MD5的方法,使用到了使用到了apache common-codec中的方法,使用该方法获取整个文件的md5的代码如下:
Stringmd51=DigestUtils.md5Hex(newFileInputStream(filename));
下面带来另一种获取文件MD5的方法,就是java自带的NIO的方法,而且该方法的效率比上述方法还高,代码如下:
publicStringgetMD5(StringfilePath) throwsException { MessageDigestmd=MessageDigest.getInstance("MD5"); FileInputStreamfis=newFileInputStream(filePath); FileChannelchannel=fis.getChannel(); ByteBufferbuffer=ByteBuffer.allocate(1024*1024); while (channel.read(buffer) !=-1) { buffer.flip(); md.update(buffer); buffer.clear(); } channel.close(); fis.close(); byte[] digest=md.digest(); StringBuildersb=newStringBuilder(); for (byteb : digest) { sb.append(String.format("%02x", b&0xff)); } returnsb.toString(); }
做了一下时间比较实验,如下:
Stringfilename="C:\\tools\\graalvm-ce-java17-windows-amd64-22.3.1.zip"; longstartTime1=System.currentTimeMillis(); Stringmd51=DigestUtils.md5Hex(newFileInputStream(filename)); System.out.println(JSON.toJSONString(md51)); System.out.println(System.currentTimeMillis()-startTime1); longstartTime2=System.currentTimeMillis(); Stringmd52=getMD5(filename); System.out.println(JSON.toJSONString(md52)); System.out.println(System.currentTimeMillis()-startTime2);
结果输出如下:
"63c4ab57b76a33ed664ca588e9b4bc44" 1611 "63c4ab57b76a33ed664ca588e9b4bc44" 781
耗时差距一倍,果断替换一下,还不用引入第三方库了,jdk本人使用的是17,如果有使用其他版本的jdk,可以自行测试一下,不保证一定比apache的效率高。