Java?SE判斷兩個文件內(nèi)容是否相同的多種方法代碼
1. 逐字節(jié)比較
逐字節(jié)比較文件內(nèi)容。這種方法適用于小文件,但對于大文件會比較耗時。
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 等),然后比較兩個文件的哈希值。如果哈希值相同,則可以認(rèn)為文件內(nèi)容相同。這種方法適用于大文件,因為只需要比較哈希值而不是整個文件內(nèi)容。
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 來逐塊讀取文件內(nèi)容,然后逐塊比較讀取的內(nèi)容。這種方法避免了每次讀取數(shù)據(jù)時的數(shù)組復(fù)制。
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,然后按照指定的緩沖區(qū)大?。ɡ?192字節(jié))逐塊讀取兩個文件的內(nèi)容,并進(jìn)行比較。如果任何一塊內(nèi)容不相等,則立即返回 false 表示文件內(nèi)容不同。如果整個文件的內(nèi)容都比較完畢且沒有發(fā)現(xiàn)不同之處,則返回 true 表示文件內(nèi)容相同。
請注意,這種方法適用于大文件,因為它可以避免一次性加載整個文件到內(nèi)存中,而是按塊逐個比較文件內(nèi)容。根據(jù)具體需求和性能要求,你可以調(diào)整緩沖區(qū)大小以優(yōu)化比較速度。
4. 文件元數(shù)據(jù)比較
比較文件的元數(shù)據(jù),包括文件名、文件大小、修改時間等。這種方法快速簡單,適用于需要快速確定文件是否相同的場景。
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() 方法來比較兩個文件的內(nèi)容是否相同。
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)
}總結(jié)
到此這篇關(guān)于Java SE判斷兩個文件內(nèi)容是否相同的多種方法的文章就介紹到這了,更多相關(guān)Java SE判斷文件內(nèi)容相同內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息
在一次項目開發(fā)中,使用到了Netty網(wǎng)絡(luò)應(yīng)用框架,以及MQTT進(jìn)行消息數(shù)據(jù)的收發(fā),這其中需要后臺來將獲取到的消息主動推送給前端,所以本文記錄了SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的操作,需要的朋友可以參考下2024-02-02
Spring注解中@Configuration和@Component到底有啥區(qū)別
之前一直搞不清@Component和@Configuration這兩個注解到底有啥區(qū)別,一直認(rèn)為被這兩修飾的類可以被Spring實例化嘛,最近終于弄明白了,這篇文章主要給大家介紹了關(guān)于Spring注解中@Configuration和@Component到底有啥區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-04-04
IntelliJ IDEA 無法正常使用SVN的問題和完美解決辦法
這篇文章主要介紹了IntelliJ IDEA 無法正常使用SVN的問題和解決辦法,本文給大家分享完美解決方案,通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
Java調(diào)用opencv實現(xiàn)圖片矯正功能
這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用opencv實現(xiàn)圖片矯正功能,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09
SpringBoot整合Swagger和Actuator的使用教程詳解
Swagger 是一套基于 OpenAPI 規(guī)范構(gòu)建的開源工具,可以幫助我們設(shè)計、構(gòu)建、記錄以及使用 Rest API。本篇文章主要介紹的是SpringBoot整合Swagger(API文檔生成框架)和SpringBoot整合Actuator(項目監(jiān)控)使用教程。感興趣的朋友一起看看吧2019-06-06

