首页 > 编程语言 >java/Android获取单个文件的MD5值,解决首位0被省略问题,解决超大文件问题,cmd命令行查看文件md5码

java/Android获取单个文件的MD5值,解决首位0被省略问题,解决超大文件问题,cmd命令行查看文件md5码

时间:2023-02-01 15:47:33浏览次数:47  
标签:bufferCount 文件 java int stringbuffer cmd import md5

code来源:https://betheme.net/news/txtlist_i67135v.html?action=onClick
cmd命令行查看文件md5码:certutil -hashfile a.txt md5,不加后面的md5,查看的默认是sha1码。

package com.tools.util;

import java.io.File;
import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;

public class MD5Util {
    private static MappedByteBuffer[] mappedByteBuffers;
    private static int bufferCount;

    /**
     * 获取单个文件的MD5值!
     *
     * @param file
     * @return 解决首位0被省略问题
     * 解决超大文件问题
     */
    public static String getFileMD5(File file) {

        StringBuffer stringbuffer = null;
        try {
            char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
            FileInputStream in = new FileInputStream(file);
            FileChannel ch = in.getChannel();

            long fileSize = ch.size();
            bufferCount = (int) Math.ceil((double) fileSize / (double) Integer.MAX_VALUE);
            mappedByteBuffers = new MappedByteBuffer[bufferCount];

            long preLength = 0;
            long regionSize = Integer.MAX_VALUE;
            for (int i = 0; i < bufferCount; i++) {
                if (fileSize - preLength < Integer.MAX_VALUE) {
                    regionSize = fileSize - preLength;
                }
                mappedByteBuffers[i] = ch.map(FileChannel.MapMode.READ_ONLY, preLength, regionSize);
                preLength += regionSize;
            }

            MessageDigest messagedigest = MessageDigest.getInstance("MD5");

            for (int i = 0; i < bufferCount; i++) {
                messagedigest.update(mappedByteBuffers[i]);
            }
            byte[] bytes = messagedigest.digest();
            int n = bytes.length;
            stringbuffer = new StringBuffer(2 * n);
            for (int l = 0; l < n; l++) {
                byte bt = bytes[l];
                char c0 = hexDigits[(bt & 0xf0) >> 4];
                char c1 = hexDigits[bt & 0xf];
                stringbuffer.append(c0);
                stringbuffer.append(c1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return stringbuffer.toString();

    }
}

  

标签:bufferCount,文件,java,int,stringbuffer,cmd,import,md5
From: https://www.cnblogs.com/xsj1989/p/17083007.html

相关文章

  • 【Java】自定义mybatis
    处理sqlin多条件搜索时单引号双引号问题StringBuilderpidNoZeroIds=newStringBuilder();IntegernumTmp=0;for(ShequLsDatingTypepidNoZero:pidNoZeroLis......
  • Java线程池中的execute和submit
    一、概述execute和submit都是线程池中执行任务的方法。execute是Executor接口中的方法publicinterfaceExecutor{voidexecute(Runnablecommand);}submit是......
  • Java多线程:Future和FutureTask
    一、FutureFuture是一个接口,所有方法如下:上源码:packagejava.util.concurrent;publicinterfaceFuture<V>{booleancancel(booleanmayInterruptIfRunning);......
  • 使用java python 实现 QI-页面排序-骑马钉
    链接:http://www.cnprint.org/bbs/thread/77/339531/......
  • Linux使用gtest测试so文件
    我使用的环境是Ubuntu22.04.1LTSgoogletest的下载链接:https://github.com/google/googletest/archive/refs/tags/v1.13.0.zip下载下来之后解压,cd到解压的文件夹里面......
  • Spring开启@Async异步方法(javaconfig配置)
    在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。应用场景:某些耗时较长的......
  • python 中给文件加锁——fcntl模块
    如果没有fcntl模块则用sudopipinstallfcntl安装模块简单说明:打开文件,不存在则创建之f=open('./test','w')fcntl.flock(f,fcntl.LOCK_EX)这样就对文件t......
  • JavaScript闭包的概念
    什么是闭包?闭包有什么作用,缺点是什么?闭包的概念:JavaScript中函数会产生闭包(closure)。闭包是函数本身和该函数声明时所处的环境状态的组合;函数能够“记忆住”其定义......
  • git项目忽略文件
    #Eclipse.project.classpath.settings/#Maventarget/dependency-reduced-pom.xmlpom.xml.versionsBackup.factorypath#Gradle.gradle/build/#IDEA#id......
  • Java 多态
    多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定。即一个引用变量倒底会指向哪个类的实例对象......