Déterminer si deux fichiers stockent le même contenu

Comment boolean sameContent(Path file1,Path file2) vous une fonction Java boolean sameContent(Path file1,Path file2) qui détermine si les deux chemins donnés pointent vers des fichiers qui stockent le même contenu? Bien sûr, je vérifierais d’abord si les tailles de fichiers sont les mêmes. C’est une condition nécessaire pour stocker le même contenu. Mais alors, j’aimerais écouter vos approches. Si les deux fichiers sont stockés sur le même disque dur (comme dans la plupart de mes cas), ce n’est probablement pas le meilleur moyen de sauter trop de fois entre les deux stream.

Exactement ce FileUtils.contentEquals méthode FileUtils.contentEquals de Apache commons IO fait et api est ici .

Essayez quelque chose comme:

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

Il effectue les vérifications suivantes avant de procéder à la comparaison:

  • existence des deux fichiers
  • Les deux fichiers transmis doivent être de type fichier et non de répertoire.
  • La longueur en octets ne doit pas être la même.
  • Les deux sont des fichiers différents et pas un et le même.
  • Ensuite, comparez le contenu.

Si vous ne voulez utiliser aucune bibliothèque externe, lisez simplement les fichiers dans des tableaux d’octets et comparez-les (cela ne fonctionnera pas avant Java-7):

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

en utilisant Arrays.equals .

Si les fichiers sont volumineux, alors, au lieu de lire les fichiers entiers dans des tableaux, vous devez utiliser BufferedInputStream et lire les fichiers par morceau comme expliqué ici .

Si les fichiers sont petits, vous pouvez lire les deux dans la mémoire et comparer les tableaux d’octets.

Si les fichiers ne sont pas petits, vous pouvez soit calculer les hachages de leur contenu (par exemple, MD5 ou SHA-1) les uns après les autres et comparer les hachages (mais cela ne laisse que très peu d’erreur), ou vous pouvez comparer leurs contenu mais pour cela, vous devez toujours lire les stream en alternance.

Voici un exemple:

 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 // (eg 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; } 

Cela devrait vous aider avec votre problème:

 package test; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; public class CompareFileContents { public static void main(Ssortingng[] 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); } } 

J’ai eu un scénario où je devais comparer deux fichiers (vidéos / images / rien). Je suis allé de l’avant en calculant le md5 pour les deux fichiers et en les comparant. Ça marchait bien

 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5EncoderUtility { public Ssortingng encodeToMd5(Ssortingng filePath) { MessageDigest md = null; try { md = MessageDigest.getInstance("SHA1"); } catch (NoSuchAlgorithmException e1) { e1.printStackTrace(); } FileInputStream fis = null; try { fis = new FileInputStream(filePath); } catch (FileNotFoundException e) { e.printStackTrace(); } byte[] dataBytes = new byte[1024]; int nread = 0; try { while ((nread = fis.read(dataBytes)) != -1) { md.update(dataBytes, 0, nread); } } catch (IOException e) { e.printStackTrace(); } byte[] mdbytes = md.digest(); // convert the byte to hex format SsortingngBuffer sb = new SsortingngBuffer(""); for (int i = 0; i < mdbytes.length; i++) { sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1)); } System.out.println("Digest(in hex format):: " + sb.toString()); return sb.toString(); } } 

 public class FileCompareUtility { MD5EncoderUtility md5EncoderUtil = new MD5EncoderUtility(); public boolean compare2Files(Ssortingng actualFilePath, Ssortingng expectedFilePath) { if ((md5EncoderUtil.encodeToMd5(actualFilePath)).equals(md5EncoderUtil.encodeToMd5(expectedFilePath))) { System.out.println("The files- "+actualFilePath+" and "+expectedFilePath+" are same"); return true; } else { System.out.println("The files- "+actualFilePath+" and "+expectedFilePath+" are NOT same"); return false; } } } 

Et peut être appelé de cette façon:

  Ssortingng actualFileComparePath = "D:/Videos/test.mp4"; Ssortingng expectedFileComparePath = "D:/Videos/test2.mp4"; // This will compare any types of files- here video.Eg-Video fileCompareUtil.compare2Files(actualFileComparePath, expectedFileComparePath);