在 Java 中比较两个文件的内容
有很多方法可以比较两个文件的内容。 本篇文章介绍了在 Java 中比较两个文件的不同方法。
Java 中两个文件的逐字节比较 BufferedInputStream 用于读取文件并将一个文件的每个字节与另一个文件进行比较。 我们使用 BufferedReader 的 read() 方法读取每个字节并进行比较。
我们创建了两个不同名称的相似文本文件,jiyik1 和 jiyik2,内容为:
Hello This is jiyik.com
The best online platform for learning different programming languages.
让我们尝试一个逐字节比较两个文件的例子。
package jiyik;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
public class File_Compare {
private static boolean CompareFilesbyByte(Path File_One, Path File_Two) {
try {
long file_size = Files.size(File_One);
if (file_size != Files.size(File_Two)) {
return false;
}
if (file_size < 2048)
{
return Arrays.equals(Files.readAllBytes(File_One),
Files.readAllBytes(File_Two));
}
// Compare byte-by-byte
try (BufferedReader Content1 = Files.newBufferedReader(File_One);
BufferedReader Content2 = Files.newBufferedReader(File_Two))
{
int byt;
while ((byt = Content1.read()) != -1)
{
if (byt != Content2.read()) {
return false;
}
}
}
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
File File_One = new File("jiyik1.txt"); // Path to file one
File File_Two = new File("jiyik2.txt"); // Path to file two
boolean Comparison = CompareFilesbyByte(File_One.toPath(), File_Two.toPath());
if (Comparison) {
System.out.println("The Input files are equal.");
}
else {
System.out.println("The Input files are not equal");
}
}
}
该代码逐字节比较文件。 输出是:
The Input files are equal.
Java 中两个文件的逐行比较
同样,BufferedInputStream 也用于读取文件并将一个文件的每一行与另一个文件的每一行进行比较。 我们使用 BufferedReader 的 readline() 方法来读取每一行并进行比较。
让我们看一个例子。
package jiyik;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
public class File_Compare {
private static boolean CompareFilesbyByte(Path File_One, Path File_Two) {
try {
long file_size = Files.size(File_One);
if (file_size != Files.size(File_Two)) {
return false;
}
if (file_size < 2048)
{
return Arrays.equals(Files.readAllBytes(File_One),
Files.readAllBytes(File_Two));
}
// Compare byte-by-byte
try (BufferedReader Content1 = Files.newBufferedReader(File_One);
BufferedReader Content2 = Files.newBufferedReader(File_Two)) {
String line;
while ((line = Content1.readLine()) != null) {
if (line !=Content2.readLine()) {
return false;
}
}
}
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
File File_One = new File("jiyik1.txt"); // Path to file one
File File_Two = new File("jiyik2.txt"); // Path to file two
boolean Comparison = CompareFilesbyByte(File_One.toPath(), File_Two.toPath());
if (Comparison) {
System.out.println("The Input files are equal.");
}
else {
System.out.println("The Input files are not equal");
}
}
}
上面的代码逐行比较两个文件。 由于文件中的内容相等,因此输出为:
The Input files are equal.
在 Java 中使用 Files.mismatch() 比较两个文件
最近 Java 12 在 java.nio.file.Files 类中添加了 Files.mismatch 方法来比较两个文件。
此方法将文件作为输入并比较给定文件的内容; 如果两个文件相等则返回 -1,否则返回第一个不匹配字节的位置。
我们创建了具有不同内容的第三个文件。 让我们尝试一个例子来比较不同的文件。
package jiyik;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class File_Compare {
public static void main(String[] args) throws IOException {
File File_One = new File("jiyik1.txt");
File File_Two = new File("jiyik2.txt");
File File_Three = new File("jiyik3.txt");
long Compare1 = Files.mismatch(File_One.toPath(), File_Two.toPath());
System.out.println(Compare1);
long Compare2 = Files.mismatch(File_Two.toPath(), File_Three.toPath());
System.out.println(Compare2);
}
}
上面的代码首先比较两个应该返回 -1 的相似文件,然后比较两个应该返回第一个不匹配字节位置的不同文件。 查看输出:
-1
34
在 Java 中使用 Apache Commons IO 比较两个文件
Apache Commons IO 的 FileUtils 类用于处理文件。 contentEquals()
方法可用于比较两个文件,如果两个文件的内容相等或两个文件都不存在,则返回 true。
让我们举个例子。
package jiyik;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class File_Compare {
public static void main(String[] args) throws IOException {
File File_One = new File("jiyik1.txt");
File File_Two = new File("jiyik2.txt");
boolean Comapre_Result = FileUtils.contentEquals(File_One, File_Two);
if (Comapre_Result) {
System.out.println("The input files are equal.");
}
else {
System.out.println("The input files are not equal.");
}
}
}
该代码使用 Apache FileUtils 类比较两个文件并检查它们是否相等。 查看输出:
The input files are equal.
在 Java 中使用 Arrays.equals() 比较两个文件
我们可以将整个文件读入字节数组,然后比较这些数组是否相等。 我们可以使用 Files.readAllBytes() 将文件读入字节数组,并使用 Arrays.equals() 检查它们是否相等。
不建议对大文件使用此方法。 参见示例:
package jiyik;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
public class File_Compare {
private static boolean CompareFileArrays(Path File_One, Path File_Two) {
try {
if (Files.size(File_One) != Files.size(File_Two)) {
return false;
}
byte[] First_File = Files.readAllBytes(File_One);
byte[] Second_File = Files.readAllBytes(File_Two);
return Arrays.equals(First_File, Second_File);
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
File File_One = new File("jiyik1.txt");
File File_Two = new File("jiyik2.txt");
boolean Compare_Result = CompareFileArrays(File_One.toPath(), File_Two.toPath());
if (Compare_Result) {
System.out.println("The Input files are equal.");
}
else {
System.out.println("The Input files are not equal.");
}
}
}
上面的代码将文件读入字节数组,然后比较这些数组。 查看输出:
The Input files are equal.
相关文章
从 Java 文件中读取整数
发布时间:2023/05/15 浏览次数:62 分类:Java
-
要从文件中读取整数,我们使用 BufferedReader 读取文件并使用 parseInt() 方法从数据中获取整数。 本教程演示了如何使用 Java 从文件中读取整数的分步过程。从 Java 文件中读取整数
Java 中的 Zip 文件
发布时间:2023/05/15 浏览次数:105 分类:Java
-
一个 zip 文件可以由一个文件、多个文件甚至一个文件夹组成。 有多种创建 zip 文件的方法。本篇文章介绍了使用 Java 创建 zip 文件的不同示例。使用 Java.Util.Zip 在 Java 中压缩单个文件
使用 Java 删除目录中的文件
发布时间:2023/05/15 浏览次数:190 分类:Java
-
在本文中,我们将学习如何在不删除文件夹本身的情况下删除文件夹中的文件。有多种方法可以做到这一点。 在 Java 中使用文件类的 delete() 删除目录中的文件
在 Java 中从文件中读取字节
发布时间:2023/05/15 浏览次数:182 分类:Java
-
Java 中有几种方法可以从文件中读取字节或将文件转换为字节或字节数组。 本教程演示了用 Java 从文件中读取字节的不同方法。
Kotlin 中 Java String[] 的等价物
发布时间:2023/05/13 浏览次数:59 分类:Java
-
本文介绍了 Kotlin 中 Java String[] 的等价物。 我们将看到所有可能的方法来为 Kotlin 实现与 Java 中的 String[] 相同的结果。
将 Java 文件代码转换为 Kotlin
发布时间:2023/05/13 浏览次数:143 分类:Java
-
Kotlin 现在是一种官方的 Android 语言。 因此,您可能希望将 Java 文件更改为 Kotlin。 本文教您如何将 Java 转换为 Kotlin。
在 Kotlin 中使用 forEach
发布时间:2023/05/13 浏览次数:122 分类:Java
-
本文介绍 Kotlin 中 forEach 关键字的概念和使用。 我们将看到一些使用 Kotlin forEach 循环的示例来理解它。
在 Kotlin 中使用 reified 关键字
发布时间:2023/05/13 浏览次数:197 分类:Java
-
reified 关键字是在 Kotlin 中使用泛型时最常使用的编程概念。在本教程中,我们将学习如何使用两种方法解决此问题,包括将类型的类作为泛型函数的参数传递,以及将 reified 关键字与内联函数
Kotlin 中 ! 和 ? 运算符之间的区别
发布时间:2023/05/13 浏览次数:180 分类:Java
-
在 Kotlin 中,断言运算符 !! 和安全调用符 ? 使用 Null 安全。本文介绍空安全的概念。 我们也将通过如何! 和 ? 在 Kotlin 中有助于空安全。