tutorial studio programacion móviles interfaz grafica español desarrollo curso aplicaciones java file comparison

java - studio - Determine si dos archivos almacenan el mismo contenido



manual de programacion android pdf (6)

¿Cómo escribiría una función java boolean sameContent(Path file1,Path file2) que determina si las dos rutas boolean sameContent(Path file1,Path file2) apuntan a archivos que almacenan el mismo contenido? Por supuesto, primero, verificaría si los tamaños de archivo son los mismos. Esta es una condición necesaria para almacenar el mismo contenido. Pero luego me gustaría escuchar sus enfoques. Si los dos archivos se almacenan en el mismo disco duro (como en la mayoría de mis casos), probablemente no sea la mejor manera de saltar demasiadas veces entre las dos transmisiones.


Desde Java 12 hay un método Files.mismatch que devuelve -1 si no hay una falta de coincidencia en el contenido de los archivos. Por lo tanto, la función se vería de la siguiente manera:

private static boolean sameContent(Path file1, Path file2) throws IOException { return Files.mismatch(file1, file2) == -1; }


Exactamente lo que FileUtils.contentEquals método FileUtils.contentEquals de Apache commons IO y api está here .

Intenta algo como:

File file1 = new File("file1.txt"); File file2 = new File("file2.txt"); boolean isTwoEqual = FileUtils.contentEquals(file1, file2);

Realiza las siguientes comprobaciones antes de hacer la comparación:

  • existencia de ambos archivos
  • Ambos archivos que se pasan deben ser de tipo de archivo y no de directorio.
  • La longitud en bytes no debe ser la misma.
  • Ambos son archivos diferentes y no uno y el mismo.
  • Luego compara los contenidos.

Si los archivos son pequeños, puede leerlos en la memoria y comparar las matrices de bytes.

Si los archivos no son pequeños, puede calcular los valores hash de su contenido (por ejemplo, MD5 o SHA-1) uno tras otro y comparar los valores hash (pero esto todavía deja una pequeña posibilidad de error), o puede comparar sus contenido pero para esto todavía tienes que leer las transmisiones alternando.

Aquí hay un ejemplo:

boolean sameContent(Path file1, Path file2) throws IOException { final long size = Files.size(file1); if (size != Files.size(file2)) return false; if (size < 4096) return Arrays.equals(Files.readAllBytes(file1), Files.readAllBytes(file2)); try (InputStream is1 = Files.newInputStream(file1); InputStream is2 = Files.newInputStream(file2)) { // Compare byte-by-byte. // Note that this can be sped up drastically by reading large chunks // (e.g. 16 KBs) but care must be taken as InputStream.read(byte[]) // does not neccessarily read a whole array! int data; while ((data = is1.read()) != -1) if (data != is2.read()) return false; } return true; }


Si no desea utilizar ninguna biblioteca externa, simplemente lea los archivos en conjuntos de bytes y compárelos (no funcionará antes de Java-7):

byte[] f1 = Files.readAllBytes(file1); byte[] f2 = Files.readAllBytes(file2);

mediante el uso de Arrays.equals .

Si los archivos son grandes, en lugar de leer los archivos completos en matrices, debe usar BufferedInputStream y leer los archivos fragmento por fragmento como se explica here .


This debería ayudarte con tu problema:

package test; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; public class CompareFileContents { public static void main(String[] args) throws IOException { File file1 = new File("test1.txt"); File file2 = new File("test2.txt"); File file3 = new File("test3.txt"); boolean compare1and2 = FileUtils.contentEquals(file1, file2); boolean compare2and3 = FileUtils.contentEquals(file2, file3); boolean compare1and3 = FileUtils.contentEquals(file1, file3); System.out.println("Are test1.txt and test2.txt the same? " + compare1and2); System.out.println("Are test2.txt and test3.txt the same? " + compare2and3); System.out.println("Are test1.txt and test3.txt the same? " + compare1and3); } }


package test; import org.junit.jupiter.api.Test; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import static org.junit.Assert.assertEquals; public class CSVResultDIfference { @Test public void csvDifference() throws IOException { Path file_F = FileSystems.getDefault().getPath("C://Projekts//csvTestX", "yolo2.csv"); long size_F = Files.size(file_F); Path file_I = FileSystems.getDefault().getPath("C://Projekts//csvTestZ", "yolo2.csv"); long size_I = Files.size(file_I); assertEquals(size_F, size_I); } }

funcionó para mí :)