乐趣区

关于java:用-Java-代码读取本地两个TXT文件并且以行为单位比较两个文件的不同

以下是应用 Java 代码读取本地两个 TXT 文件,并以行为单位比拟两个文件的不同的示例:


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FileComparator {public static void main(String[] args) {
        String fileAPath = "C:/Users/MAO/Desktop/A.txt";
        String fileBPath = "C:/Users/MAO/Desktop/B.txt";

        List<String> fileALines = readFileLines(fileAPath);
        List<String> fileBLines = readFileLines(fileBPath);

        List<String> uniqueLinesInFileA = new ArrayList<>();
        for (String line : fileALines) {if (!fileBLines.contains(line)) {uniqueLinesInFileA.add(line);
            }
        }

        List<String> uniqueLinesInFileB = new ArrayList<>();
        for (String line : fileBLines) {if (!fileALines.contains(line)) {uniqueLinesInFileB.add(line);
            }
        }

        // 文件 A 中不在文件 B 中的行
        System.out.println("Lines in file A that are not in file B:");
        for (String line : uniqueLinesInFileA) {System.out.println(line);
        }

        // 文件 B 中不在文件 A 中的行
        System.out.println("Lines in file B that are not in file A:");
        for (String line : uniqueLinesInFileB) {System.out.println(line);
        }

    }

    private static List<String> readFileLines(String filePath) {List<String> lines = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {lines.add(line);
            }
        } catch (IOException e) {e.printStackTrace();
        }
        return lines;
    }
}

用 JAVA 8 格调能够这样写:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;

public class FileComparator {public static void main(String[] args) throws IOException {
        String fileAPath = "C:/Users/MAO/Desktop/A.txt";
        String fileBPath = "C:/Users/MAO/Desktop/B.txt";

        List<String> fileALines = Files.lines(Paths.get(fileAPath))
                .collect(Collectors.toList());

        List<String> fileBLines = Files.lines(Paths.get(fileBPath))
                .collect(Collectors.toList());

        // 文件 A 中不在文件 B 中的行
        List<String> uniqueLinesInFileA = fileALines.stream()
                .filter(line -> !fileBLines.contains(line))
                .collect(Collectors.toList());

        // 文件 B 中不在文件 A 中的行
        List<String> uniqueLinesInFileB = fileBLines.stream()
                .filter(line -> !fileALines.contains(line))
                .collect(Collectors.toList());

        System.out.println("Lines in file A that are not in file B:");
        uniqueLinesInFileA.forEach(System.out::println);

        System.out.println("Lines in file B that are not in file A:");
        uniqueLinesInFileB.forEach(System.out::println);
    }
}

应用 Java 8 的 Files.lines() 办法能够间接读取文件的所有行,并返回一个流。而后,能够应用流的各种操作(如 filter 和 collect)对文件进行解决。


两个文件内容如图所示:

打印后果:

Lines in file A that are not in file B:
6666
Lines in file B that are not in file A:
666

请确保替换 fileAPath 和 fileBPath 变量的值为理论的文件门路。以上代码会比拟文件 A 中的每一行是否存在于文件 B 中,并将文件 A 中独有的行打印进去。

请留神,以上代码假如文件内容较小,能够一次性读取到内存中。如果文件较大,可能须要采纳逐行读取和缓存的形式进行比拟,以防止内存溢出。

退出移动版