2009-10-02 6 views
0

Mon application Java doit pouvoir comparer deux fichiers différents dans le système de fichiers et décider si leur contenu binaire est identique ou non.Comment comparer le contenu de deux fichiers texte et retourner "Même contenu" ou "contenu différent"?

Voici mon code actuel:

package utils; 
import java.io.*; 

class compare { 
    public static void main(String args[]) throws IOException { 
     FileInputStream file1 = new InputStream(args[0]); 
     FileInputStream file2 = new InputStream(args[1]); 

     try { 
      if(args.length != 2) 
       throw (new RuntimeException("Usage : java compare <filetoread> <filetoread>")); 
      while (true) { 
       int a = file1.read(); 
       int b = file2.read(); 
       if (a==-1) { 
        System.out.println("Both the files have same content"); 
       } 
       else{ 
        System.out.println("Contents are different"); 
       } 
      } 
     } 
     catch (Exception e) { 
      System.out.println("Error: " + e); 
     } 
    } 
} 

Des conseils ou des suggestions sur la façon de faire correctement la fonction de comparaison serait appréciée.

+0

Utilisez FileUtils pour cela. Très facile à mettre en œuvre. Exemple ici: http://www.avajava.com/tutorials/lessons/whats-a-quick-way-to-tell-if-the-contents-of-two-files-are-identical-or-not.html . Je posterais ceci comme une vraie réponse, mais quelqu'un est devenu confus et a pensé que ce n'était pas une vraie question. –

Répondre

7

La manière la plus simple consiste à lire le contenu en deux chaînes, par ex.

FileInputStream fin = new FileInputStream(args[i]); 
    BufferedReader myInput = new BufferedReader(new InputStreamReader(fin)); 
    StringBuilder sb = new StringBuilder(); 
    while ((thisLine = myInput.readLine()) != null) { 
      sb.append(thisLine); 
    } 

, et d'effectuer un .equals() sur ceux-ci. Avez-vous besoin de capacités de différenciation plus complexes?

+0

non, le plus simple sera le mieux. pouvez-vous me dire comment l'implémenter? –

+0

Je ne suis pas la réponse n'est pas à peu près dans le ci-dessus –

+0

ouais! Ça marche!! Merci! –

2

Lisez le contenu des fichiers et utilisez la classe MessageDigest pour créer un hachage MD5 du contenu de chaque fichier. Puis comparez les deux hachages. Cela a l'avantage de travailler aussi pour les fichiers binaires.

+0

Vrai, mais n'est pas définitif. Deux fichiers peuvent avoir la même valeur mais être différents. Je suppose qu'un hash MD5 est assez grand et assez imprévisible pour que cela soit peu probable, mais je suis toujours nerveux des algorithmes qui fonctionnent "la plupart du temps". – Jay

+7

Un problème beaucoup plus important est que cette méthode est assez inefficace - elle lit toujours l'intégralité des deux fichiers, même si (par exemple) il y a une différence dans le premier octet. La comparaison des blocs donne directement un «départ anticipé», donc vous quittez la comparaison dès que vous trouvez une différence. Le hachage est plus utile si vous faites quelque chose comme trouver des doublons dans un système de fichiers, donc vous voulez comparer le fichier X avec des dizaines de milliers d'autres. Dans ce cas, si vous obtenez un hachage en double, vous pouvez comparer les fichiers eux-mêmes pour vérifier qu'ils sont vraiment les mêmes. –

3
import java.io.*; 

public class Testing { 
public static void main(String[] args) throws java.io.IOException { 

    BufferedReader bfr2 = new BufferedReader(new InputStreamReader(
      System.in)); 
    String s1 = ""; 
    String s2 = "", s3 = "", s4 = ""; 
    String y = "", z = ""; 

    File file1 = new File("args[0]"); 
    File file2 = new File("args[1]"); 

    BufferedReader bfr = new BufferedReader(new FileReader(file1)); 
    BufferedReader bfr1 = new BufferedReader(new FileReader(file2)); 

    while ((z = bfr1.readLine()) != null) 
     s3 += z; 

    while ((y = bfr.readLine()) != null) 
     s1 += y; 

    System.out.println(); 

    System.out.println(s3); 

    if (s3.equals(s1)) { 
     System.out.println("Content of both files are same"); 
    } else { 

     System.out.println("Content of both files are not same"); 
    } 
} 
} 
+0

son fonctionnement, Mais pourrait être l'algorithme de temps si nous avions l'habitude de comparer de nombreux fichiers dans une boucle. –

Questions connexes