JAVA-读取文件部分内容计算HASH值

对于一些大文件,有时会需要计算部分内容的Hash,下面的函数计算了 文件头尾各1M,中间跳跃100M取10K 以及文件大小的Hash值

public static String CalHash(String path) throws IOException
    {
        File file = new File(path);
        if (!file.canRead())
            return "";
        if (file.length() < 150 * 1024 * 1024) {
            return "";
        }

        //FileInputStream in = new FileInputStream(file);
        RandomAccessFile in = new RandomAccessFile(file, "r");

        MessageDigest messagedigest;
        try {
            messagedigest = MessageDigest.getInstance("SHA1");
            int szRead = 0;
            int size_1M = 1024*1024;
            byte[] buffer = new byte[size_1M];
            // 文件头尾各1M,中间跳跃100M取10K算Hash
            // 开头
            szRead = in.read(buffer);
            messagedigest.update(buffer);
            // 结尾
            in.seek(file.length() - size_1M);
            szRead = in.read(buffer);
            messagedigest.update(buffer);

            int BUFFER_SIZE = (10 * 1024);
            buffer = new byte[(int) BUFFER_SIZE];

            long endPos = file.length() - 1024 * 1024 - BUFFER_SIZE;
            long skipSize = (long) ( ((float) (file.length() / (float) (100.0 * 1024.0 * 1024.0) - (float) 1.0) * BUFFER_SIZE) );
            long currentPos = 1024 * 1024;
            in.seek(currentPos);
            while (in.getFilePointer() < endPos && in.read(buffer) > 0) {
                in.seek(in.getFilePointer() + skipSize);
                messagedigest.update(buffer);
            }

            // 计算文件size的hash
            long fsize = file.length();
            byte[] fSizeBytes = getBytes(fsize);
            messagedigest.update(fSizeBytes);
            return byte2hex(messagedigest.digest());

        } catch (NoSuchAlgorithmException e) {
        } catch (OutOfMemoryError e) {
        } finally {
            in.close();
        }
        return null;
    }
时间: 2024-08-07 10:51:12

JAVA-读取文件部分内容计算HASH值的相关文章

Java 读取文件的内容

1) CLASS_NAME: 换成自己真实的类名 2) /page/test.json: 换成自己真实的page 3) FileUtils: 来自于org.apache.commons.io.FileUtils(org.apache.commons) File f = new File(Thread.currentThread().getContextClassLoader().getResource("").getPath()); String basePath = f.getPat

Java读取文件夹大小的6种方法及代码

这篇文章介绍了JAVA读取文件夹大小的几种方法实例,有需要的朋友可以参考一下. (一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; // 递归方式 计算文件的大小

[Java]读取文件方法大全(转)

[Java]读取文件方法大全 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {    /**     * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件.     */    public static void readFileByBytes(String fileName) {        File file = new File(fileName);        Input

【转】Java读取文件方法大全

本文转自:http://www.cnblogs.com/lovebread/archive/2009/11/23/1609122.html#undefined 目录: 按字节读取文件内容 按字符读取文件内容 按行读取文件内容 随机读取文件内容 将内容追加到文件尾部 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fil

java创建文件相关内容

1.定义writerfile 类,定义创建文件的名称,路径,及其是否成功,设置文件内容等相关函数 public class WriterFile { public String filepath=null; public String filename=null; public String fileContent=null; public Boolean success; //创建文件路径 public void SetFilePath(String s) { filepath=s; try

Java读取文件 利用MappedByteBuffer进行缓冲

Java读取文件 利用MappedByteBuffer进行缓冲,这样可以保证边读取大文件,边进行处理 package sean; import java.io.ByteArrayInputStream; import java.io.File; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.util.Scann

Java读取文件的问题

java读取文件的两种方法:java.io和java.lang.ClassLoader (我就知道这两种.....) // java.io: File file = new File("..."); FileInputStream fis = new FileInputStream("..."); FileReader fr = new FileReader("..."); //ClassLoader: ClassLoader loader =

Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和区别

一.Java读取和存储文件数据流 Java读取文件,实际是将文件中的字节流转换成字符流输出到屏幕的过程 这里面涉及到两个类:InputStreamReader和OutputStreamWriter InputStreamReader:将字节流转换成字符流 OutputStreamWriter:将字符流转换成字节流 InputStreamReader继承Reader类 OutputStreamWriter继承Writer类 二.BufferedReader/FileReader/InputStre

Java读取文件的注意点

关于Java读取UTF-8和UTF-8 BOM文件的问题记录在此,仅给自己提个醒. 今天从文本文件中读取数据存储到数据库中,操作完之后检验数据库发现有一些记录出现差错,几经排查(╮(╯Д╰)╭,自己忘了把异常输出,费了不少时间.),发现都是每个文本文件下的第一行出现差错,终于找到原因了,是文件的编码惹的祸.存储数据的文本文件编码类型为UTF-8 BOM,文件编码类型该了一下,再一检验,问题解决. 处理方法可以参考http://www.2cto.com/kf/201108/98509.html J