FileMD5Util.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package cn.com.taiji.util.bigfile;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.IOException;
  8. import java.lang.reflect.Method;
  9. import java.math.BigInteger;
  10. import java.nio.MappedByteBuffer;
  11. import java.nio.channels.FileChannel;
  12. import java.security.AccessController;
  13. import java.security.MessageDigest;
  14. import java.security.PrivilegedAction;
  15. /**
  16. * 文件md5值
  17. *
  18. * version 1.0
  19. */
  20. public class FileMD5Util {
  21. private final static Logger logger = LoggerFactory.getLogger(FileMD5Util.class);
  22. public static String getFileMD5(File file) throws FileNotFoundException {
  23. String value = null;
  24. FileInputStream in = new FileInputStream(file);
  25. MappedByteBuffer byteBuffer = null;
  26. try {
  27. byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
  28. MessageDigest md5 = MessageDigest.getInstance("MD5");
  29. md5.update(byteBuffer);
  30. BigInteger bi = new BigInteger(1, md5.digest());
  31. value = bi.toString(16);
  32. if (value.length() < 32) {
  33. value = "0" + value;
  34. }
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. } finally {
  38. if (null != in) {
  39. try {
  40. in.getChannel().close();
  41. in.close();
  42. } catch (IOException e) {
  43. logger.error("get file md5 error!!!", e);
  44. }
  45. }
  46. if (null != byteBuffer) {
  47. freedMappedByteBuffer(byteBuffer);
  48. }
  49. }
  50. return value;
  51. }
  52. /**
  53. * 在MappedByteBuffer释放后再对它进行读操作的话就会引发jvm crash,在并发情况下很容易发生
  54. * 正在释放时另一个线程正开始读取,于是crash就发生了。所以为了系统稳定性释放前一般需要检 查是否还有线程在读或写
  55. *
  56. * @param mappedByteBuffer
  57. */
  58. public static void freedMappedByteBuffer(final MappedByteBuffer mappedByteBuffer) {
  59. try {
  60. if (mappedByteBuffer == null) {
  61. return;
  62. }
  63. mappedByteBuffer.force();
  64. AccessController.doPrivileged(new PrivilegedAction<Object>() {
  65. @Override
  66. public Object run() {
  67. try {
  68. Method getCleanerMethod = mappedByteBuffer.getClass().getMethod("cleaner", new Class[0]);
  69. getCleanerMethod.setAccessible(true);
  70. sun.misc.Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod.invoke(mappedByteBuffer,
  71. new Object[0]);
  72. cleaner.clean();
  73. } catch (Exception e) {
  74. logger.error("clean MappedByteBuffer error!!!", e);
  75. }
  76. logger.info("clean MappedByteBuffer completed!!!");
  77. return null;
  78. }
  79. });
  80. } catch (Exception e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. }