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

这篇具有很好参考价值的文章主要介绍了【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() 方法来比较两个文件的内容是否相同。文章来源地址https://www.toymoban.com/news/detail-727006.html

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】判断两个文件内容是否相同的多种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java 判断两个List是否包含 判断两个list相等

    java 判断两个List是否包含 判断两个list相等 https://blog.51cto.com/u_12855/7333853 1、直接使用equals()比较 众所周知,两个列表具有完全相同的元素并且具有完全相同的顺序时,它们是相等的。因此, 如果我们业务要求两个list顺序一致,可以使用equals()方法进行相等性检查: 即使

    2024年02月04日
    浏览(41)
  • Java 判断两个IP段是否有交集

    一、背景介绍 在有些场景,需要判断IP段是否有交集,比如:配置一些设备的过滤规则,避免IP段重复配置,需要做IP段是否重叠的校验。 IP段有交集的场景有几种: 1)IP段1包含IP段2; 2)IP段2包含IP段1; 3)IP段1的起始IP与IP段2的结束IP相同,或者IP段1的结束IP与IP段2的起始

    2024年02月16日
    浏览(32)
  • Java判断两个集合是否具有交集以及如何获得交集

    全限定名为java.util.Collections,在俩个集合没有交集的时候会返回true,否则返回false。 比如: 结果: 全限定名为:org.apache.commons.collections.CollectionUtils,两个集合有交集会返回true,否则会返回false,跟Collections.disjoint相反。 例如: 结果: 全限定名为:cn.hutool.core.collection.Coll

    2024年02月06日
    浏览(40)
  • 【华为机试真题详解JAVA实现】—判断两个IP是否属于同一子网

        目录 一、题目描述 二、解题代码 IP地址是由4个0-255之间的整数构成的,用\\\".\\\"符号相连。 二进制的IP地址格式有32位,例如:10000011,01101011,00000011,00011000;每八位用十进制表示就是131.107.3.24 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。 子网

    2023年04月09日
    浏览(64)
  • SQL 确定两个表是否有相同的数据

    描述: 想知道两个表或两个视图里是否有相同的数据(行数和值)。考虑如下所示的视图。  我希望确定该视图是否和  EMP  表有完全相同的数据。与员工 WARD 相关的数据有两行,这表明相应的解决方案不仅要找出来不同的数据,还要找到重复的数据。根据  EMP  表的数据,

    2023年04月23日
    浏览(27)
  • Collections.disjoint方法,优雅进行两个集合有没有相同的元素判断

    比较 两个集合 中 有没有相同的元素 java.util. Collections.disjoint (Collection? c1, Collection? c2) 以下是结果:

    2024年02月15日
    浏览(36)
  • Java如何判断某文件目录是否存在

    在java中如何判断某文件所在的目录是否存在,若不存在创建目录 可以通过国使用 File 类的 getParentFile() 方法来获取文件所在的目录,并通过 exists() 方法来判断该目录是否存在,若不存在,通过 mkdirs() 方法创建目录,以下为实例 或直接简写

    2024年02月12日
    浏览(47)
  • 判断两个数组是否相等

    在判断两个数组是否相等之前,我们应该弄清楚数组怎样才算相等,官方给的解释是这样的: Returns true if the two specified arrays of ints are equal to one another. Two arrays are considered equal if both arrays contain the same number of elements, and all corresponding pairs of elements in the two arrays are equal. In other

    2024年02月15日
    浏览(37)
  • 判断两个vector数组是否相等

    判断两个vector数组是否相等是可以直接使用==或者!=的 因为vector内部都进行了相关运算符的重载,还可以进行比较大小 下面这道简单搜索题就用到了这个性质,浅看一下吧 【问题描述】给定一个n个整数的集合X={x1,x2,…xn}(X中可能包含重复元素)和整数y,找出和等于y的X的子集

    2024年02月12日
    浏览(40)
  • C语言--输入一个数判断是否为素数(多种方法)

     需要解决这个问题,首先我们要明白 --------什么是素数? (质数)素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 举个例子:4  可以 由2*2=4  和1*4 得到,不符合素数的条件,所以不是素数。                   5  只能由1*5 得到,符合素数的

    2024年01月25日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包