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判断文件内容相同内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java的@Transactional、@Aysnc、事务同步问题详解
这篇文章主要介绍了Java的@Transactional、@Aysnc、事务同步问题详解,现在我们需要在一个业务方法中插入一个用户,这个业务方法我们需要加上事务,然后插入用户后,我们要异步的方式打印出数据库中所有存在的用户,需要的朋友可以参考下2023-11-11SpringBoot RESTful 应用中的异常处理梳理小结
这篇文章主要介绍了SpringBoot RESTful 应用中的异常处理梳理小结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-05-05jquery uploadify和apache Fileupload实现异步上传文件示例
这篇文章主要介绍了jquery uploadify和apache Fileupload实现异步上传文件示例,需要的朋友可以参考下2014-05-05
最新评论