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 等),然后比較兩個文件的哈希值。如果哈希值相同,則可以認為文件內(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)容,并進行比較。如果任何一塊內(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)文章
spring?retry方法調(diào)用失敗重試機制示例解析
這篇文章主要為大家介紹了spring?retry方法調(diào)用失敗重試機制的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03spring boot攔截器注入不了java bean的原因
這篇文章主要介紹了spring boot攔截器注入不了java bean的原因,幫助大家更好的理解和學(xué)習(xí)spring boot框架,感興趣的朋友可以了解下2020-11-11SpringBoot如何配置獲取request中body的json格式參數(shù)
這篇文章主要介紹了SpringBoot如何配置獲取request中body的json格式參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06