最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java計算文件MD5值幾種實現(xiàn)方式(支持大文件)

 更新時間:2025年09月03日 10:49:57   作者:ecexy78041  
MD5是由Ron Rivest設(shè)計的一種加密哈希函數(shù),它能夠生成一個唯一的128位(16字節(jié))哈希值,這篇文章主要介紹了Java計算文件MD5值幾種實現(xiàn)方式(支持大文件)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

在 Java 中計算文件的 MD5 值,特別是對于大文件,需要使用流式處理以避免內(nèi)存溢出。以下是幾種實現(xiàn)方式:

方法1:使用 MessageDigest 和 FileInputStream(標準方式)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class FileMD5Calculator {
    
    public static String calculateMD5(File file) throws IOException, NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        try (FileInputStream fis = new FileInputStream(file)) {
            byte[] buffer = new byte[8192]; // 8KB緩沖區(qū)
            int length;
            while ((length = fis.read(buffer)) != -1) {
                md.update(buffer, 0, length);
            }
        }
        return bytesToHex(md.digest());
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }

    public static void main(String[] args) {
        try {
            File file = new File("large_file.zip");
            String md5 = calculateMD5(file);
            System.out.println("MD5: " + md5);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法2:使用 Apache Commons Codec(簡化版)

如果你項目中已經(jīng)使用了 Apache Commons Codec,可以使用更簡潔的方式:

import org.apache.commons.codec.digest.DigestUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileMD5Calculator {
    
    public static String calculateMD5(File file) throws IOException {
        try (FileInputStream fis = new FileInputStream(file)) {
            return DigestUtils.md5Hex(fis);
        }
    }

    public static void main(String[] args) {
        try {
            File file = new File("large_file.zip");
            String md5 = calculateMD5(file);
            System.out.println("MD5: " + md5);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法3:使用 Java NIO(高性能版)

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class FileMD5Calculator {
    
    public static String calculateMD5(Path path) throws IOException, NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        try (FileChannel channel = FileChannel.open(path, StandardOpenOption.READ)) {
            ByteBuffer buffer = ByteBuffer.allocateDirect(8192); // 直接緩沖區(qū)
            while (channel.read(buffer) != -1) {
                buffer.flip();
                md.update(buffer);
                buffer.clear();
            }
        }
        return bytesToHex(md.digest());
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }

    public static void main(String[] args) {
        try {
            Path path = Path.of("large_file.zip");
            String md5 = calculateMD5(path);
            System.out.println("MD5: " + md5);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法4:使用 Guava 庫

如果你使用 Google Guava 庫:

import com.google.common.hash.Hashing;
import com.google.common.io.Files;

import java.io.File;
import java.io.IOException;

public class FileMD5Calculator {
    
    public static String calculateMD5(File file) throws IOException {
        return Files.hash(file, Hashing.md5()).toString();
    }

    public static void main(String[] args) {
        try {
            File file = new File("large_file.zip");
            String md5 = calculateMD5(file);
            System.out.println("MD5: " + md5);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

性能比較

  • 標準方式(方法1):適用于大多數(shù)場景,性能良好

  • Apache Commons Codec(方法2):代碼最簡潔,性能稍遜于標準方式

  • NIO 方式(方法3):處理大文件性能最佳,但代碼稍復雜

  • Guava 方式(方法4):簡潔但需要引入額外依賴

注意事項

  • 緩沖區(qū)大小:8KB(8192字節(jié))是一個經(jīng)驗值,可以根據(jù)實際情況調(diào)整

  • 大文件處理:所有方法都支持大文件,因為它們都是流式處理

  • 異常處理:需要處理 IOException 和 NoSuchAlgorithmException

  • 文件鎖定:計算過程中文件會被鎖定,無法被其他程序修改

  • MD5 安全性:MD5 已不推薦用于安全敏感場景,僅適用于校驗文件完整性

選擇哪種方法取決于你的項目環(huán)境和需求。如果項目已經(jīng)使用了 Apache Commons Codec 或 Guava,使用相應(yīng)的方法會更方便;否則,標準方式或 NIO 方式都是不錯的選擇。

總結(jié)

到此這篇關(guān)于Java計算文件MD5值幾種實現(xiàn)方式(支持大文件)的文章就介紹到這了,更多相關(guān)Java計算文件MD5值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Spring Web Jackson對RequestBody反序列化失敗的解決

    基于Spring Web Jackson對RequestBody反序列化失敗的解決

    這篇文章主要介紹了基于Spring Web Jackson對RequestBody反序列化失敗的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java實例化類詳解

    Java實例化類詳解

    學習JAVA這門面向?qū)ο蟮恼Z言,實質(zhì)就是不斷地創(chuàng)建類,并把類實例化為對象并調(diào)用方法。對于初學JAVA的人總搞清楚對象是如何實例化的,假如類之間存在繼承關(guān)系,那就更糊涂了。下面我們通過兩個例題來說明對象的實例化過程。
    2016-03-03
  • JDBC插入數(shù)據(jù)返回數(shù)據(jù)主鍵代碼實例

    JDBC插入數(shù)據(jù)返回數(shù)據(jù)主鍵代碼實例

    這篇文章主要介紹了JDBC插入數(shù)據(jù)返回數(shù)據(jù)主鍵代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Java Web學習之Cookie和Session的深入理解

    Java Web學習之Cookie和Session的深入理解

    這篇文章主要給大家介紹了關(guān)于Java Web學習之Cookie和Session的相關(guān)資料,需要的朋友可以參考下
    2018-04-04
  • Java中NIO的三大核心組件詳細解析

    Java中NIO的三大核心組件詳細解析

    這篇文章主要介紹了Java中NIO的三大核心組件詳細解析,NIO的Buffer類是一個抽象類,位于java.nio包中,提供了一組更加有效的方法,用來進行寫入和讀取的交替訪問,本質(zhì)上是一個內(nèi)存塊,既可以寫入數(shù)據(jù),也可以從中讀取數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • SpringBoot中實現(xiàn)分布式的Session共享的詳細教程

    SpringBoot中實現(xiàn)分布式的Session共享的詳細教程

    這篇文章主要介紹了SpringBoot中實現(xiàn)分布式的Session共享,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Java getParameter()獲取數(shù)據(jù)為空的問題

    Java getParameter()獲取數(shù)據(jù)為空的問題

    這篇文章主要介紹了Java getParameter()獲取數(shù)據(jù)為空的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 關(guān)于Java8 parallelStream并發(fā)安全的深入講解

    關(guān)于Java8 parallelStream并發(fā)安全的深入講解

    這篇文章主要給大家介紹了關(guān)于Java8 parallelStream并發(fā)安全的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-10-10
  • 使用Spring自身提供的地址匹配工具匹配URL操作

    使用Spring自身提供的地址匹配工具匹配URL操作

    這篇文章主要介紹了使用Spring自身提供的地址匹配工具匹配URL操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 23種設(shè)計模式(18)java備忘錄模式

    23種設(shè)計模式(18)java備忘錄模式

    這篇文章主要為大家詳細介紹了23種設(shè)計模式之java備忘錄模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

北流市| 扶绥县| 屯留县| 成都市| 怀安县| 舞阳县| 图木舒克市| 龙口市| 章丘市| 定安县| 汝州市| 扬州市| 北宁市| 崇州市| 青州市| 和硕县| 竹山县| 利津县| 牟定县| 宝山区| 黄平县| 汪清县| 亳州市| 昭苏县| 治多县| 廊坊市| 葫芦岛市| 布尔津县| 慈溪市| 凌源市| 庄河市| 霍州市| 涟源市| 深水埗区| 大理市| 巴青县| 汉中市| 思茅市| 古丈县| 济宁市| 武夷山市|