我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【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)}

来源地址:https://blog.csdn.net/weixin_43553153/article/details/131717002

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java判断文件是否相同的方法

java判断文件是否相同的方法:1、计算MD5或SHA-1然后对比判断 // 计算文件的 MD5 值 根据MD5值 判断文件是否是同一个文件public static String getFileMD5(File file) { if (!fil
java判断文件是否相同的方法
2016-07-17

java判断两个日期是否同一天的方法

java判断两个日期是否同一天的方法:1、使用Calendar来实现Calendar cal1 = Calendar.getInstance();Calendar cal2 = Calendar.getInstance();cal1.setTime(date1
java判断两个日期是否同一天的方法
2018-02-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录