Java 13 都快要來了,12必須跟棧長學起!
之前分享了一些 Java 12 的騷操作,今天繼續,今天要分享的是 Java 12 中的文件比對騷操作。
我們或多或少會遇到這樣的需求:怎么比對兩個文件中的內容一樣?
你會把兩個文件中的內容拉出來一個個字符對比,然后提交一大堆不怎么優雅的代碼?
這樣你就太 OUT 了!
在 Java 12 中,僅需要 1 行代碼即可搞定!
來看示例代碼:
public static void main(String[] args) throws IOException {
Path dir = Paths.get("d:/");
Path path1 = dir.resolve("javastack1.txt");
Path path2 = dir.resolve("javastack2.txt");
long result = Files.mismatch(path1, path2);
System.out.println(result);
}
Files.mismatch 一行搞定!
javastack1 和 javastack2 的內容都是:
www.javastack.cn
這時候輸出結果:-1。
現在把 javastack2 的內容改成:
http://www.javastack.cn
這時候輸出結果:0。
再把 javastack2 的內容改成:
www.javastack.cn/
這時候輸出結果:16。
Files.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 mismatch
return -1;
}
totalRead += nRead1;
}
}
}
- 返回-1:同一文件,或者兩個文件內容一樣
- 返回其他數字:文件內容對比差異的位置,從0開始
所以,只要返回 -1,說明文件內容相同。
好了,今天的分享就到這,記住了,別說我沒告訴你。。
收藏轉發一下吧,多學習了解,日后必定有用!
歷史 Java 新特性干貨分享:
獲取上面這份 Java 8~12 系列新特性干貨文章,請在微信搜索關注微信公眾號:Java技術棧,在公眾號后台回復:java。
本文原創首發於微信公眾號:Java技術棧(id:javastack),轉載請原樣保留本信息。