Java12引入了一個新的方法 mismatch
,它屬于java.nio.file.Files
類。此方法用于比較兩個文件的內容,并返回第一個不匹配字節的位置。如果兩個文件完全相同,則返回-1
。
Files.mismatch
方法聲明
public static long mismatch(Path path1, Path path2) throws IOException
參數說明:
path1
: 第一個文件的路徑。path2
: 第二個文件的路徑。
返回值說明:
- 返回兩個文件之間第一個不匹配字節的位置。如果兩個文件完全相同,則返回
-1
。 - 如果一個文件是另一個文件的前綴,則返回較短文件的長度。
異常說明:
IOException
: 如果發生I/O錯誤,拋出IOException異常,例如文件不存在。
Files.mismatch
的使用
以下是一個使用Files.mismatch
方法的示例代碼:
package com.morris.java12;import java.io.FileWriter;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;/*** 使用FileMismatch對文件進行比較*/
public class FileMismatchDemo {public static void main(String[] args) throws IOException {FileWriter a1 = new FileWriter("d:/a1.txt");a1.write("abc中國");a1.write("efg");a1.write("123");a1.close();FileWriter a2 = new FileWriter("d:/a2.txt");a2.write("abc中國"); // 中文占3個字節a2.write("efg");a2.write("124");a2.close();long ap = Files.mismatch(Path.of("d:/a1.txt"), Path.of("d:/a2.txt"));System.out.println("a1 and a2 mismatch: " + ap); // 14FileWriter b1 = new FileWriter("d:/b1.txt");b1.write("abc");b1.close();FileWriter b2 = new FileWriter("d:/b2.txt");b2.write("abc");b2.close();long bp = Files.mismatch(Path.of("d:/b1.txt"), Path.of("d:/b2.txt"));System.out.println("b1 and b2 mismatch: " + bp); // -1}
}
運行結果如下:
a1 and a2 mismatch: 14
b1 and b2 mismatch: -1
如果文件內容相同,mismatch
方法將返回-1
。
如果文件內容不同,mismatch
方法將返回第一個不匹配字節的位置。
如果文件長度不同,如果一個文件是另一個文件的前綴,mismatch
方法將返回較短文件的長度。
這個新方法對文件比較非常有用,可以大大簡化需要逐字節比較文件內容的代碼。
Files.mismatch
的源碼分析
public static long mismatch(Path path, Path path2) throws IOException {if (isSameFile(path, path2)) {return -1;}byte[] buffer1 = new byte[BUFFER_SIZE];byte[] buffer2 = new byte[BUFFER_SIZE];try (InputStream in1 = Files.newInputStream(path);InputStream in2 = Files.newInputStream(path2)) {long totalRead = 0;while (true) {int nRead1 = in1.readNBytes(buffer1, 0, BUFFER_SIZE);int nRead2 = in2.readNBytes(buffer2, 0, BUFFER_SIZE);int i = Arrays.mismatch(buffer1, 0, nRead1, buffer2, 0, nRead2);if (i > -1) {return totalRead + i;}if (nRead1 < BUFFER_SIZE) {// we've reached the end of the files, but found no mismatchreturn -1;}totalRead += nRead1;}}
}
底層使用了Arrays.mismatch()
比較兩個文件的字節數組。