Vergleichen Sie den Inhalt zweier Dateien in Java

Sheeraz Gul 12 Oktober 2023
  1. Byte-für-Byte-Vergleich zweier Dateien in Java
  2. Zeilenweiser Vergleich zweier Dateien in Java
  3. Vergleichen Sie zwei Dateien mit Files.mismatch() in Java
  4. Vergleichen Sie zwei Dateien mit Apache Commons IO in Java
  5. Vergleichen Sie zwei Dateien mit Arrays.equals() in Java
Vergleichen Sie den Inhalt zweier Dateien in Java

Es gibt einige Möglichkeiten, den Inhalt zweier Dateien zu vergleichen. Dieses Tutorial zeigt verschiedene Möglichkeiten, zwei Dateien in Java zu vergleichen.

Byte-für-Byte-Vergleich zweier Dateien in Java

Der BufferedInputStream wird verwendet, um die Datei zu lesen und jedes Byte einer Datei mit der anderen Datei zu vergleichen. Wir verwenden die read()-Methode von BufferedReader, um jedes Byte zu lesen und zu vergleichen.

Wir haben zwei ähnliche Textdateien mit unterschiedlichen Namen erstellt, delftstack1 und delftstack2, mit dem Inhalt:

Hello This is delftstack.com
The best online platform for learning different programming languages.

Versuchen wir ein Beispiel, um beide Dateien Byte für Byte zu vergleichen.

package delftstack;

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("delftstack1.txt"); // Path to file one
    File File_Two = new File("delftstack2.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");
    }
  }
}

Der Code vergleicht die Dateien byteweise. Die Ausgabe ist:

The Input files are equal.

Zeilenweiser Vergleich zweier Dateien in Java

Ebenso wird der BufferedInputStream auch verwendet, um die Datei zu lesen und jede Zeile einer Datei mit jeder Zeile der anderen Datei zu vergleichen. Wir verwenden die readline()-Methode von BufferedReader, um jede Zeile zu lesen und zu vergleichen.

Sehen wir uns ein Beispiel an.

package delftstack;

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("delftstack1.txt"); // Path to file one
    File File_Two = new File("delftstack2.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");
    }
  }
}

Der obige Code vergleicht zwei Dateien Zeile für Zeile. Da der Inhalt in den Dateien gleich ist, lautet die Ausgabe:

The Input files are equal.

Vergleichen Sie zwei Dateien mit Files.mismatch() in Java

Kürzlich hat Java 12 die Methode Files.mismatch in der Klasse java.nio.file.Files hinzugefügt, um zwei Dateien zu vergleichen.

Diese Methode nimmt Dateien als Eingaben und vergleicht den Inhalt bestimmter Dateien; Es gibt -1 zurück, wenn die beiden Dateien gleich sind, und wenn nicht, gibt es die Position des ersten nicht übereinstimmenden Bytes zurück.

Wir haben eine dritte Datei mit anderem Inhalt erstellt. Versuchen wir ein Beispiel, um die verschiedenen Dateien zu vergleichen.

package delftstack;

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("delftstack1.txt");
    File File_Two = new File("delftstack2.txt");
    File File_Three = new File("delftstack3.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);
  }
}

Der obige Code vergleicht zuerst zwei ähnliche Dateien, die -1 zurückgeben sollten, und vergleicht dann zwei verschiedene Dateien, die die Position des ersten nicht übereinstimmenden Bytes zurückgeben sollten. Siehe Ausgabe:

-1
34

Vergleichen Sie zwei Dateien mit Apache Commons IO in Java

Die Klasse FileUtils von Apache Commons IO wird verwendet, um mit Dateien zu arbeiten. Die Methode contentEquals() kann verwendet werden, um zwei Dateien zu vergleichen, die true zurückgibt, wenn der Inhalt zweier Dateien gleich ist oder beide Dateien nicht existieren.

Versuchen wir es an einem Beispiel.

package delftstack;

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;

public class File_Compare {
  public static void main(String[] args) throws IOException {
    File File_One = new File("delftstack1.txt");
    File File_Two = new File("delftstack2.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.");
    }
  }
}

Der Code vergleicht zwei Dateien und prüft, ob sie gleich sind oder nicht, indem er die Apache-Klasse FileUtils verwendet. Siehe Ausgabe:

The input files are equal.

Vergleichen Sie zwei Dateien mit Arrays.equals() in Java

Wir können die gesamten Dateien in Byte-Arrays einlesen und diese Arrays dann auf Gleichheit vergleichen. Mit Files.readAllBytes() können wir die Datei in Byte-Arrays einlesen und mit Arrays.equals() deren Gleichheit prüfen.

Diese Methode wird für große Dateien nicht empfohlen. Siehe Beispiel:

package delftstack;

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("delftstack1.txt");
    File File_Two = new File("delftstack2.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.");
    }
  }
}

Der obige Code liest die Dateien in Byte-Arrays und vergleicht dann diese Arrays. Siehe Ausgabe:

The Input files are equal.
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Verwandter Artikel - Java File