Comparar contenido de dos archivos en Java

Sheeraz Gul 12 octubre 2023
  1. Comparación byte por byte de dos archivos en Java
  2. Comparación línea por línea de dos archivos en Java
  3. Compara dos archivos con Files.mismatch() en Java
  4. Compare dos archivos con Apache Commons IO en Java
  5. Compara dos archivos con Arrays.equals() en Java
Comparar contenido de dos archivos en Java

Hay bastantes formas de comparar el contenido de dos archivos. Este tutorial demuestra diferentes formas de comparar dos archivos en Java.

Comparación byte por byte de dos archivos en Java

El BufferedInputStream se utiliza para leer el archivo y comparar cada byte de un archivo con el otro archivo. Usamos el método read() de BufferedReader para leer cada byte y compararlo.

Creamos dos archivos de texto similares con diferentes nombres, delftstack1 y delftstack2, con el contenido:

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

Probemos un ejemplo para comparar ambos archivos byte a byte.

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");
    }
  }
}

El código compara los archivos byte a byte. La salida es:

The Input files are equal.

Comparación línea por línea de dos archivos en Java

De manera similar, el BufferedInputStream también se usa para leer el archivo y comparar cada línea de un archivo con cada línea del otro archivo. Usamos el método readline() de BufferedReader para leer cada línea y compararla.

Veamos un ejemplo.

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");
    }
  }
}

El código anterior compara dos archivos línea por línea. Como el contenido de los archivos es igual, la salida es:

The Input files are equal.

Compara dos archivos con Files.mismatch() en Java

Recientemente, Java 12 agregó el método Files.mismatch en la clase java.nio.file.Files para comparar dos archivos.

Este método toma archivos como entradas y compara el contenido de los archivos dados; devuelve -1 si los dos archivos son iguales, y si no, devuelve la posición del primer byte no coincidente.

Creamos un tercer archivo con diferente contenido. Probemos un ejemplo para comparar los diferentes archivos.

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);
  }
}

El código anterior primero compara dos archivos similares que deberían devolver -1 y luego compara dos archivos diferentes que deberían devolver la posición del primer byte no coincidente. Ver salida:

-1
34

Compare dos archivos con Apache Commons IO en Java

La clase FileUtils de Apache Commons IO se utiliza para trabajar con archivos. El método contentEquals() se puede utilizar para comparar dos archivos que devolverán true si el contenido de dos archivos es igual o ambos archivos no existen.

Probemos un ejemplo.

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.");
    }
  }
}

El código compara dos archivos y comprueba si son iguales o no utilizando la clase FileUtils de Apache. Ver salida:

The input files are equal.

Compara dos archivos con Arrays.equals() en Java

Podemos leer los archivos completos en matrices de bytes y luego comparar estas matrices para la igualdad. Podemos usar Files.readAllBytes() para leer el archivo en matrices de bytes y Arrays.equals() para verificar su igualdad.

Este método no se recomienda para archivos grandes. Ver ejemplo:

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.");
    }
  }
}

El código anterior lee los archivos en matrices de bytes y luego compara esas matrices. Ver salida:

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

Artículo relacionado - Java File