Como comparar 2 arquivos no idea

preciso verificar se dois arquivos sao iguais… porem tentei usar o equals e nao deu certo…

meu codigo eh esse…

import java.io.*; public class ComparaArquivo { public static void main(String[] args) throws Exception { FileInputStream teste = new FileInputStream("teste.exe"); FileInputStream teste2 = new FileInputStream("teste2.exe"); if(teste.equals(teste2)) System.out.println("Iguais"); else System.out.println("Diferentes"); } }

grato a qm m ajudar!!!

Compare os MessageDigests deles.

Quanto a isto, Este post pode ser um bom ponto-de-partida.

o Message Digest só vai servir para comparar o tamanho dos arquivos, e não se os arquivos são exatamente iguais… podem ter o mesmo tamanho, mas conteúdos diferentes…

acho q a única maneira é comparar byte a byte…

o q tu esta fazendo no if(equals) é comparar os Objetos em Java e não os Arquios em si…

o q sera preciso fazer é um while ou for, a ler byte a byte e comparar um com o outro…

[quote=eduveks]o Message Digest só vai servir para comparar o tamanho dos arquivos, e não se os arquivos são exatamente iguais… podem ter o mesmo tamanho, mas conteúdos diferentes…

acho q a única maneira é comparar byte a byte…

o q tu esta fazendo no if(equals) é comparar os Objetos em Java e não os Arquios em si…

o q sera preciso fazer é um while ou for, a ler byte a byte e comparar um com o outro…[/quote]

vlw eduveks… vou tentar fazer isso e se nao funcionar posto o q fiz…
grato

Consegui \o/

obrigados a todos q postaram neste topico

Se possível poste o código que conseguiu para futuras pesquisas

Se possível poste o código que conseguiu para futuras pesquisas

Meu a solução é simples, dois whiles(um para cada arquivo) um dentro do outro listando byte a byte, com um if a comparar os bytes dos dois arquivos.

Isto para arquivos pequenos ok… agora arquivos com muitos MBs é loucura! O tempo e o processamento vai ser bem custoso

Como comparar 2 arquivos no idea

O que o Aldrin Leal disse (obter o MessageDigest de cada um dos arquivos e comparar) é na prática o melhor método de comparar arquivos. Ele pode ser usado, por exemplo, para determinar em seu HD quais arquivos são repetidos.

Digamos que você tenha um HD com um milhão de arquivos (isso não é impossível porque existem HDs de 500 GBs relativamente baratos). Quero preparar uma lista dos arquivos que estão repetidos. Vou mostrar que isso é relativamente rápido de fazer, e muito seguro.

Se você comparar um por um, pelos conteúdos, você precisaria de fazer (1.000.000 x 999.999) / 2 comparações, o que levaria um tempo realmente absurdo. Se levar 0.5 segundo para comparar dois arquivos (um HD muito rápido com arquivos muito pequenos), você levaria cerca de 7927 anos para fazer a comparação . Portanto essa não é a melhor maneira.

O que você deve fazer:

  • Crie uma tabela em que um dos campos seja o "message digest" (usualmente 16 ou 20 bytes; para ser mais rigoroso, você pode usar o SHA-512, que tem 64 bytes), e o outro o nome do arquivo. Deixe essa tabela ordenada pelo "message digest".
  • Varra todos os arquivos, calculando o "message digest" de cada um, e insira os valores obtidos na tabela.
    Digamos que ler o arquivo e calcular seu "message digest" leve 0.5 segundo; isso dá 5 dias e 19 horas aproximadamente.
  • Agora inspecione a tabela, e veja quais são os arquivos com o mesmo "message digest". (Algo como "select nomearquivo, messagedigest from arquivos where count (messagedigest) &gt 1 group by messagedigest - meu SQL não é grande coisa mas você deve pegar a idéia).
    Usualmente, com uma precisão muito grande, arquivos com o mesmo "message digest" têm conteúdos iguais (e a precisão é melhor para um message digest maior, por isso é que sugeri o SHA-512); mas se quiser ser mais rigoroso, você só precisa comparar o conteúdo dos arquivos com o mesmo "message digest" entre si, o que leva muito menos tempo que comparar todos contra todos.

Experimentei rodar este programa em alguns diretórios de meu HD e achei um monte de arquivos repetidos.

import java.util.*; import java.security.*; import java.io.*; /** * * Esta classe lista um diretório (e seus subdiretórios), * e indica quais arquivos têm o mesmo "message digest". * Provavelmente arquivos com o mesmo "message digest" devem ter o mesmo tamanho. * Exemplo de compilação e uso (requer Java 5.0): * javac TesteComparacaoArquivos * java -cp . TesteComparacaoArquivos "c:\projetos" */ class TesteComparacaoArquivos { private static final String MESSAGE_DIGEST = "SHA-512"; private MessageDigest digest; public TesteComparacaoArquivos () { try { digest = MessageDigest.getInstance (MESSAGE_DIGEST); } catch (NoSuchAlgorithmException ex) { ex.printStackTrace(); } } private void listarRecursivamente (List<File> arquivos, File diretorio) { File[] diretoriosEArquivos = diretorio.listFiles(); for (File f : diretoriosEArquivos) { if (f.isDirectory()) { listarRecursivamente (arquivos, f); } else { arquivos.add (f); } } } private String toHex (byte[] bytes) { StringBuilder ret = new StringBuilder(); for (int i = 0; i &lt bytes.length; ++i) { ret.append (String.format ("%02X", (bytes[i] & 0xFF))); } return ret.toString(); } private String obterDigest (File f) throws IOException { digest.reset(); DigestInputStream dis = new DigestInputStream (new FileInputStream (f), digest); byte[] buffer = new byte [1024]; int nBytes; while ((nBytes = dis.read (buffer)) &gt 0) { } dis.close(); return toHex (digest.digest()); } public void listarArquivosRepetidos (File diretorio) throws IOException { List<File> arquivos = new ArrayList<File>(); System.out.println ("Listando os subdiretórios..."); listarRecursivamente (arquivos, diretorio); SortedMap <String, List ><File> &gt arquivosPorDigest = new TreeMap <String, List ><File>&gt(); // Criando a lista dos arquivos... System.out.printf ("Analisando os %d arquivos...", arquivos.size()); int i = 0; long t = System.currentTimeMillis(); for (File f : arquivos) { ++i; if (i % 10 == 0) System.out.print ("."); String hexDigest = obterDigest (f); List &lt File &gt arquivosComMesmoDigest = arquivosPorDigest.get (hexDigest); if (arquivosComMesmoDigest == null) { arquivosPorDigest.put (hexDigest, arquivosComMesmoDigest = new ArrayList<File>()); } arquivosComMesmoDigest.add (f); } System.out.println (); System.out.printf ("Cada arquivo levou em média %.2f ms para ser processado%n", (double)(System.currentTimeMillis() - t) / arquivos.size()); System.out.println ("-------------"); // Agora imprimindo a lista de arquivos repetidos System.out.println ("Arquivos repetidos neste diretório e em seus subdiretórios:"); System.out.println(); boolean found = false; for (Map.Entry &lt String, List &lt File &gt &gt entry : arquivosPorDigest.entrySet()) { String digest = entry.getKey(); List &lt File &gt arquivosComMesmoDigest = entry.getValue(); if (arquivosComMesmoDigest.size() &gt 1) { // arquivos repetidos found = true; System.out.printf ("%3d arquivos com mesmo digest: (%s)%n", arquivosComMesmoDigest.size(), digest); for (File f : arquivosComMesmoDigest) { System.out.println (" " + f.getAbsolutePath()); } } } if (!found) { System.out.println ("Não foram encontrados arquivos repetidos."); } } /** Listando os arquivos repetidos do diretorio corrente e seus subdiretorios */ public static void main(String[] args) throws IOException { TesteComparacaoArquivos tca = new TesteComparacaoArquivos(); tca.listarArquivosRepetidos (new File (args[0])); } }

Como comparar 2 arquivos no idea
eduveks:

[quote=Mark_Ameba]Se possível poste o código que conseguiu para futuras pesquisas

Meu a solução é simples, dois whiles(um para cada arquivo) um dentro do outro listando byte a byte, com um if a comparar os bytes dos dois arquivos.

Isto para arquivos pequenos ok… agora arquivos com muitos MBs é loucura! O tempo e o processamento vai ser bem custoso

Como comparar 2 arquivos no idea
[/quote]

Eu não quero isso agora, mas assim como ele teve essa duvida, pode não ser o único e se alguém quiser saber vai ta aqui
para isso o fórum^^

eu estou com essa dúvida, se puder postar o código, preciso fazer a comparação de palavras de 2 arquivos e cairia como uma luva, pois estou tendo dificuldades

Ressuscitando…

Dependendo da necessidade de cada um, até compensa comparar o

file.lastModified() .

Abs

Como comparar 2 arquivos no idea
ricardonerd:

eu estou com essa dúvida, se puder postar o código, preciso fazer a comparação de palavras de 2 arquivos e cairia como uma luva, pois estou tendo dificuldades

Você quer comparar 2 arquivos pelas palavras como se fosse o utilitário 'diff" do Unix? (ou o WinMerge do Windows?) Se for isso, é um pouco chato, eu recomendaria, nesse caso, pegar a saída do utilitário ‘diff’