Java 12 騷操作, 文件比對居然還能這樣玩!


Java 13 都快要來了,12必須跟棧長學起!

Java 13 即將發布,新特性必須搶先看!

之前分享了一些 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),轉載請原樣保留本信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM