Java SE判断两个文件内容是否相同的多种方法代码

 更新时间:2023年11月17日 16:04:14   作者:pcdd  
昨天因为要帮师兄的忙所以看了一下如何判断两个文件内容是否相同,这里给大家总结下,这篇文章主要给大家介绍了关于Java SE判断两个文件内容是否相同的多种方法,需要的朋友可以参考下

1. 逐字节比较

逐字节比较文件内容。这种方法适用于小文件,但对于大文件会比较耗时。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public boolean areFilesEqual(Path file1, Path file2) throws IOException {
    return Files.mismatch(file1, file2) == -1;
}
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;

public boolean areFileContentsEqual(Path file1, Path file2) throws IOException {
    byte[] content1 = Files.readAllBytes(file1);
    byte[] content2 = Files.readAllBytes(file2);
    return Arrays.equals(content1, content2);
}
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;

public static boolean areFileContentsEqual(Path file1, Path file2) throws IOException {
    try (InputStream is1 = Files.newInputStream(file1);
         InputStream is2 = Files.newInputStream(file2)) {
        int byte1, byte2;
        
        do {
            byte1 = is1.read();
            byte2 = is2.read();
            if (byte1 != byte2) {
                return false;
            }
        } while (byte1 != -1);
        
        return true;
    }
}

2. 文件摘要(哈希值)比较

计算文件的哈希值(如 MD5、SHA-256 等),然后比较两个文件的哈希值。如果哈希值相同,则可以认为文件内容相同。这种方法适用于大文件,因为只需要比较哈希值而不是整个文件内容。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public boolean areFilesEqual(byte[] input1, byte[] input2) throws IOException, NoSuchAlgorithmException {
    MessageDigest md5 = MessageDigest.getInstance("MD5");

    byte[] file1Hash = md5.digest(input1);
    byte[] file2Hash = md5.digest(input2);

    return MessageDigest.isEqual(file1Hash, file2Hash);
}

3. FileChannel

通过使用 FileChannel 来逐块读取文件内容,然后逐块比较读取的内容。这种方法避免了每次读取数据时的数组复制。

public boolean areFileContentsEqual(Path file1, Path file2) throws IOException {
    try (FileChannel channel1 = FileChannel.open(file1, StandardOpenOption.READ);
         FileChannel channel2 = FileChannel.open(file2, StandardOpenOption.READ)) {

        long size1 = channel1.size();
        long size2 = channel2.size();

        if (size1 != size2) {
            // File sizes are different, contents cannot be equal
            return false;
        }

        ByteBuffer buffer1 = ByteBuffer.allocateDirect(8192);
        ByteBuffer buffer2 = ByteBuffer.allocateDirect(8192);

        while (channel1.read(buffer1) != -1) {
            buffer1.flip();
            channel2.read(buffer2);
            buffer2.flip();

            if (!buffer1.equals(buffer2)) {
                // File contents are not equal
                return false;
            }

            buffer1.clear();
            buffer2.clear();
        }

        return true;
    }
}

在上述代码中,我们打开两个文件的 FileChannel,然后按照指定的缓冲区大小(例如8192字节)逐块读取两个文件的内容,并进行比较。如果任何一块内容不相等,则立即返回 false 表示文件内容不同。如果整个文件的内容都比较完毕且没有发现不同之处,则返回 true 表示文件内容相同。

请注意,这种方法适用于大文件,因为它可以避免一次性加载整个文件到内存中,而是按块逐个比较文件内容。根据具体需求和性能要求,你可以调整缓冲区大小以优化比较速度。

4. 文件元数据比较

比较文件的元数据,包括文件名、文件大小、修改时间等。这种方法快速简单,适用于需要快速确定文件是否相同的场景。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;

public boolean areFilesEqual(Path file1, Path file2) throws IOException {
    BasicFileAttributes attrs1 = Files.readAttributes(file1, BasicFileAttributes.class);
    BasicFileAttributes attrs2 = Files.readAttributes(file2, BasicFileAttributes.class);

    return attrs1.size() == attrs2.size() &&
           attrs1.lastModifiedTime().equals(attrs2.lastModifiedTime());
}

5. Apache Commons IO 库

使用 Apache Commons IO 库中的FileUtils类提供的 contentEquals() 方法来比较两个文件的内容是否相同。

import org.apache.commons.io.FileUtils;

public boolean areFilesEqual(File file1, File file2) throws IOException {
    return FileUtils.contentEquals(file1, file2);
}

6. Hutool 库

import cn.hutool.core.io.FileUtil;

public boolean areFilesEqual(File file1, File file2) throws IOException {
    FileUtil.contentEquals(file1,file2)
}

总结 

到此这篇关于Java SE判断两个文件内容是否相同的多种方法的文章就介绍到这了,更多相关Java SE判断文件内容相同内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring retry方法调用失败重试机制示例解析

    spring retry方法调用失败重试机制示例解析

    这篇文章主要为大家介绍了spring retry方法调用失败重试机制的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • JAVA区间值判断[10,20)的实现

    JAVA区间值判断[10,20)的实现

    本文主要介绍了JAVA区间值判断[10,20)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • spring boot拦截器注入不了java bean的原因

    spring boot拦截器注入不了java bean的原因

    这篇文章主要介绍了spring boot拦截器注入不了java bean的原因,帮助大家更好的理解和学习spring boot框架,感兴趣的朋友可以了解下
    2020-11-11
  • jvm堆外内存排查图文举例详解

    jvm堆外内存排查图文举例详解

    Java应用程序通过直接方式从操作系统中申请的内存,叫堆外内存,这篇文章主要给大家介绍了关于jvm堆外内存排查的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • SpringBoot如何配置获取request中body的json格式参数

    SpringBoot如何配置获取request中body的json格式参数

    这篇文章主要介绍了SpringBoot如何配置获取request中body的json格式参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 深入了解Java定时器中的Timer的原理

    深入了解Java定时器中的Timer的原理

    这篇文章主要介绍了Java定时器中的Timer的原理。Timer主要用于Java线程里指定时间或周期运行任务,它是线程安全的,但不提供实时性(real-time)保证。接下来就跟随小编一起深入了解Timer吧
    2022-01-01
  • java 页面url传值中文乱码的解决方法

    java 页面url传值中文乱码的解决方法

    本节讲的是ajax 的URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码。
    2013-03-03
  • 使用Java实现对两个秒级时间戳相加

    使用Java实现对两个秒级时间戳相加

    在现代应用程序开发中,时间戳的处理是一个常见需求,特别是当我们需要对时间戳进行运算时,比如时间戳的相加操作,本文我们将探讨如何使用Java对两个秒级时间戳进行相加,并展示详细的代码示例和运行结果,需要的朋友可以参考下
    2024-08-08
  • Spring Boot示例代码整合Redis详解

    Spring Boot示例代码整合Redis详解

    SpringBoot对常用的数据库支持外,对NoSQL 数据库也进行了封装自动化,下面这篇文章主要给大家介绍了关于springboot使用redis的详细步骤,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Java行为型模式中命令模式分析

    Java行为型模式中命令模式分析

    在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时可以使用命令模式来进行设计
    2023-02-02

最新评论