推荐使用 files.mismatch()(jdk 12+),它逐字节流式比较,不占内存,返回-1表示内容完全一致,自动处理空文件、长度不等及io异常,并可定位首个差异位置。

直接比字节最准,不看文件名、路径或修改时间,只看内容本身是否一模一样。Java 提供了多种方式,选哪种取决于你的 JDK 版本、文件大小和是否需要额外信息(比如差异位置)。
推荐用 Files.mismatch()(JDK 12+)
这是目前最简洁、高效、安全的方式。它逐字节流式读取,不加载整个文件到内存,适合任意大小的文件,返回 -1 表示完全一致。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 代码极简:
return Files.mismatch(path1, path2) == -1; - 自动处理空文件、长度不等、IO 异常等边界情况
- 能定位首个差异字节索引,方便调试或生成差异报告
- 对符号链接、权限、换行符风格无感,专注真实内容
兼容老版本 JDK(如 8/11)
如果还在用 JDK 8 或 11,可以用手动流式比对,避免内存溢出风险。
- 用
InputStream逐字节读取并比较,遇到不同立即返回 false - 必须检查文件长度是否相等(先比
file.length()),否则长文件会多读 - 记得用 try-with-resources 自动关闭流,防止句柄泄漏
- 不建议用
Files.readAllBytes()+Arrays.equals(),大文件容易 OOM
需要缓存或批量校验时用哈希(MD5/SHA-256)
适合小到中等文件(
- 计算两个文件的 SHA-256 值再比字符串,结果一致即内容一致
- 注意:哈希碰撞概率极低但非零,生产环境关键数据建议辅以字节比对抽样
- 别用 MD5 做安全用途,SHA-256 更稳妥
- Apache Commons IO 的
FileUtils.checksumCRC32()可作轻量替代
慎用逐行对比(BufferedReader)
只适用于纯文本且明确要求“按行语义”一致的场景,比如配置文件校验。
- 会忽略行尾差异(
\r\nvs\n)、空行、BOM 头等细节 - 二进制文件(PDF、图片、JAR)会直接失败或误判
- UTF-8 编码问题可能导致
readLine()解析异常 - 真正要查内容是否相同,优先走字节层,不是文本层
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










