Comparar el contenido de dos ficheros con Java

30/Jul/2010 Java , , , , , 7 Comentarios

En este ejemplo vamos a ver como podemos comparar el contenido de dos ficheros de texto con Java y comprobar si el contenido es el mismo o es diferente.

Lo primero será crear una clase del tipo FileReader. Esta clase nos va a ayudar a acceder al contenido de los ficheros, conjuntamente con un BufferedReader. De esta forma crear un stream de un fichero a un BufferedReaderr lo podemos hacer con el siguiente código:

  1. FileReader fr1 = new FileReader("fichero1.txt");

Como tenemos dos ficheros, repetimos la misma sentencia para el segundo fichero:

  1. FileReader fr1 = new FileReader("fichero1.txt");
  2. FileReader fr2 = new FileReader("fichero2.txt");
  3.  

Ahora que tenemos un BufferedReader será sencillo ir leyendo el contenido del fichero, ya que solo tendremos que ir lanzando el método readLine() hasta que lleguemos al final de los ficheros.

Así recorreremos los ficheros mientras lo leído no sea null, ya que significará que hemos llegado al final del fichero, o bien que asumamos que los ficheros siguen siendo iguales, lo cual controlaremos mediante una variable de bandera que denominaremos iguales.

De esta manera el bucle para recorrer los ficheros será de la siguiente forma:

  1. sCadena1 = bf1.readLine();
  2. sCadena2 = bf2.readLine();
  3.  
  4. while ((sCadena1!=null) && (sCadena2!=null) && iguales) {...}

Dentro del bucle compararemos las líneas almacenadas en las cadenas. Si las líneas son iguales asumiremos que los ficheros siguen siendo iguales, leeremos e iteraremos otra vez.

Si las líneas no son iguales significa que el contenido es diferente. En ese caso cambiaremos el valor de la variable iguales a "false" para provocar una salida del bucle.

El código quedará de la siguiente manera:

  1. sCadena1 = bf1.readLine();
  2. sCadena2 = bf2.readLine();
  3.  
  4. while ((sCadena1!=null) && (sCadena2!=null) && iguales) {
  5.  
  6. if (!sCadena1.equals(sCadena2))
  7. iguales = false;
  8.  
  9. sCadena1 = bf1.readLine();
  10. sCadena2 = bf2.readLine();
  11. }

Una vez hemos salido del bucle sabremos que los ficheros son iguales si la variable iguales sigue siendo true y si hemos llegado al final de la lectura de los dos ficheros, es decir, que las variables de lectura contengan un valor null. Así tendremos el siguiente código:

  1. if ((iguales) && (sCadena1==null) && (sCadena2==null))
  2. System.out.println("Los ficheros son iguales");
  3. else
  4. System.out.println("Los ficheros son diferentes");

En todo este código tenemos que tener cuidado ya que podemos tener excepciones FileNotFoundException, si los fichero a leer no existen o IOException si tenemos problemas en la lectura de los mismos. Es por ello que todo el código irá dentro de su estructura try-catch.

Vídeos sobre Java IO


7 comentarios en “Comparar el contenido de dos ficheros con Java”

Víctor Cuervo

ramos

y para que solo me muestre el archivo uno todos las lineas diferentes del segundo

Víctor Cuervo

Víctor Cuervo

@Ernesto,

Podrías leer en base a caracteres. Si el carácter de los dos ficheros coincide incrementas una variable que sea coincide y si son diferentes incrementas una variable que sea nocoincide. Luego solo tienes que sumarlas para calcular el total y los porcentajes.

Me gusta la propuesta de idea e intentaremos publicarlo en la web.

Víctor Cuervo

Ernesto

necesito comparar 2 ficheros de texto aproximadamente del mismo tamaño, y obtener un pociento de similitud entre estos dos. Alguien que se le oocurra alguna buena idea por favor puede escribirme a mi direccion email {erdguez @ estudiantes . uci . cu (le quitan los espacios y resuelto el problema)} GRACIAS.

Víctor Cuervo

Ernesto

eso simplemente no me convence

Víctor Cuervo

Mauricio

Me refiero a (cantidad de lineas archivo 1) > 0 y < (cantidad de lineas archivo 2).

Si el primer archivo llega antes al final, la condición lanzará un nullpointerexception.

Al revés no existe el problema, por que al comparar una cadena con un null devuelve falso.

Saludos.

Víctor Cuervo

lineadecodigo

@Mauricio,

Pero si tuviese menos líneas, no habría entrado en el bucle. En el bucle solo entra si hay contenido en los dos ficheros.

¿Correcto?

Víctor Cuervo

Mauricio

En la linea 6 del bucle debería cambiarse por la siguiente condición :

if (sCadena1 == null || !sCadena1.equals(sCadena2))

Hay que considerar que el primer archivo tenga menos lineas que el segundo.

saludos a todos..

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*

*