Java?SE判斷兩個(gè)文件內(nèi)容是否相同的多種方法代碼
1. 逐字節(jié)比較
逐字節(jié)比較文件內(nèi)容。這種方法適用于小文件,但對(duì)于大文件會(huì)比較耗時(shí)。
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. 文件摘要(哈希值)比較
計(jì)算文件的哈希值(如 MD5、SHA-256 等),然后比較兩個(gè)文件的哈希值。如果哈希值相同,則可以認(rèn)為文件內(nèi)容相同。這種方法適用于大文件,因?yàn)橹恍枰容^哈希值而不是整個(gè)文件內(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
通過(guò)使用 FileChannel 來(lái)逐塊讀取文件內(nèi)容,然后逐塊比較讀取的內(nèi)容。這種方法避免了每次讀取數(shù)據(jù)時(shí)的數(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; } }
在上述代碼中,我們打開(kāi)兩個(gè)文件的 FileChannel,然后按照指定的緩沖區(qū)大?。ɡ?192字節(jié))逐塊讀取兩個(gè)文件的內(nèi)容,并進(jìn)行比較。如果任何一塊內(nèi)容不相等,則立即返回 false 表示文件內(nèi)容不同。如果整個(gè)文件的內(nèi)容都比較完畢且沒(méi)有發(fā)現(xiàn)不同之處,則返回 true 表示文件內(nèi)容相同。
請(qǐng)注意,這種方法適用于大文件,因?yàn)樗梢员苊庖淮涡约虞d整個(gè)文件到內(nèi)存中,而是按塊逐個(gè)比較文件內(nèi)容。根據(jù)具體需求和性能要求,你可以調(diào)整緩沖區(qū)大小以?xún)?yōu)化比較速度。
4. 文件元數(shù)據(jù)比較
比較文件的元數(shù)據(jù),包括文件名、文件大小、修改時(shí)間等。這種方法快速簡(jiǎn)單,適用于需要快速確定文件是否相同的場(chǎng)景。
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 庫(kù)
使用 Apache Commons IO 庫(kù)中的FileUtils類(lèi)提供的 contentEquals() 方法來(lái)比較兩個(gè)文件的內(nèi)容是否相同。
import org.apache.commons.io.FileUtils; public boolean areFilesEqual(File file1, File file2) throws IOException { return FileUtils.contentEquals(file1, file2); }
6. Hutool 庫(kù)
import cn.hutool.core.io.FileUtil; public boolean areFilesEqual(File file1, File file2) throws IOException { FileUtil.contentEquals(file1,file2) }
總結(jié)
到此這篇關(guān)于Java SE判斷兩個(gè)文件內(nèi)容是否相同的多種方法的文章就介紹到這了,更多相關(guān)Java SE判斷文件內(nèi)容相同內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring?retry方法調(diào)用失敗重試機(jī)制示例解析
這篇文章主要為大家介紹了spring?retry方法調(diào)用失敗重試機(jī)制的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn)
本文主要介紹了JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09spring boot攔截器注入不了java bean的原因
這篇文章主要介紹了spring boot攔截器注入不了java bean的原因,幫助大家更好的理解和學(xué)習(xí)spring boot框架,感興趣的朋友可以了解下2020-11-11SpringBoot如何配置獲取request中body的json格式參數(shù)
這篇文章主要介紹了SpringBoot如何配置獲取request中body的json格式參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06使用Java實(shí)現(xiàn)對(duì)兩個(gè)秒級(jí)時(shí)間戳相加
在現(xiàn)代應(yīng)用程序開(kāi)發(fā)中,時(shí)間戳的處理是一個(gè)常見(jiàn)需求,特別是當(dāng)我們需要對(duì)時(shí)間戳進(jìn)行運(yùn)算時(shí),比如時(shí)間戳的相加操作,本文我們將探討如何使用Java對(duì)兩個(gè)秒級(jí)時(shí)間戳進(jìn)行相加,并展示詳細(xì)的代碼示例和運(yùn)行結(jié)果,需要的朋友可以參考下2024-08-08