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),转载请原样保留本信息。

读取字符点阵文件后,可以将点阵数据转化为二维数组,并且使用另一个二维数组存储一个参考点阵。然后,遍历字符点阵数组,逐个比对其对应位置上的值与参考点阵数组中对应位置上的值是否相同,如果不同则说明两个点阵不相同。比对完成后,可以输出比对结果,以便用户了解两个点阵的相似度。以下是示例代码: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class CharMatrixComparator { public static void main(String[] args) throws IOException { // 读取字符点阵文件 char[][] matrix = readCharMatrixFromFile("matrix.txt"); // 读取参考点阵文件 char[][] reference = readCharMatrixFromFile("reference.txt"); // 比对两个点阵是否相同 boolean isSame = true; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { if (matrix[i][j] != reference[i][j]) { isSame = false; break; } } } System.out.println("The two matrices are " + (isSame ? "" : "not ") + "the same."); } /** * 从文件中读取字符点阵 */ private static char[][] readCharMatrixFromFile(String filePath) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(filePath)); StringBuilder builder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { builder.append(line); } reader.close(); // 转化为二维数组 String[] lines = builder.toString().split("\n"); char[][] matrix = new char[lines.length][]; for (int i = 0; i < lines.length; i++) { String str = lines[i].trim(); matrix[i] = str.toCharArray(); } return matrix; } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值