jump to navigation

Comparar el contenido de dos ficheros con Java Julio 30, 2010

Publicado por lineadecodigo en : Java , trackback

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.

Articulos Similares:

|- Descargar el código
|- Reportar error en el código
|- Foro sobre Java IO

Enviar entrada por email Enviar entrada por email | Imprimir Imprimir | 387 visitas

1 Star2 Stars3 Stars4 Stars5 Stars (Todavia sin evaluar)
Loading ... Loading ...

Comentarios»

1. Mauricio - Julio 31, 2010

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..

2. lineadecodigo - Agosto 3, 2010

@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?

3. Mauricio - Agosto 3, 2010

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.




Si tienes dudas sobre Java IO no dudes en visitar el Foro sobre Java IO.
Imagen CAPTCHA CAPTCHA Audio
Refrescar imagen