Olá pessoal, sou novo aqui no fórum e tbm no mundo Java… hehehe
Vim atrás de uma ajuda de vcs…
Preciso saber como faço para gerar o hash de um arquivo qualquer (jpg, txt, doc, ppt, etc)… Pois tenho apenas o diretório deste arquivo, onde este diretório está em um JTextField… A partir DESTE DIRETÓRIO é que preciso gerar o hash do arquivo, não do diretório em si, e sim todo conteúdo do arquivo, de modo que qualquer alteração seja detectada pelo MD5…
Segue um trecho do código abaixo…
publicvoidactionPerformed(ActionEvente){if(e.getSource()==button1){JFileChooserarq1=newJFileChooser();// seleciona qualquer tipo de arquivoarq1.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);intcaminho1=arq1.showOpenDialog(null);if(caminho1==JFileChooser.APPROVE_OPTION){Filearquivo1=arq1.getSelectedFile();text1.setText(arquivo1.getAbsolutePath());//seta text1 com o diretório//Bem aqui preciso chamar a função MD5, passando este diretório/endereço... é possível?}elseJOptionPane.showMessageDialog(null,"Você não selecionou nenhum diretório.");}elseif(e.getSource()==button2){//mesma coisa do button1//Jtextfield pega o endereço do arquivo2... }}
publicstaticvoidmain(String[]args)throwsNoSuchAlgorithmException,FileNotFoundException{MessageDigestdigest=MessageDigest.getInstance("MD5");Filef=newFile("c:\\myfile.txt");InputStreamis=newFileInputStream(f);byte[]buffer=newbyte[8192];intread=0;try{while((read=is.read(buffer))>0){digest.update(buffer,0,read);}byte[]md5sum=digest.digest();BigIntegerbigInt=newBigInteger(1,md5sum);Stringoutput=bigInt.toString(16);System.out.println("MD5: "+output);}catch(IOExceptione){thrownewRuntimeException("Unable to process file for MD5",e);}finally{try{is.close();}catch(IOExceptione){thrownewRuntimeException("Unable to close input stream for MD5 calculation",e);}}}
é o primeiro link… [google]md5 java file[/google]
C
Computeiro
Vlw Mario… agora uma dúvida…
Suponha que eu coloque este código que vc postou, em uma outra classe, num arquivo diferente, com a classe chamada GeraHash, por exemplo…
Então preciso chamar essa classe GeraHash passando como parâmetro o “endereço” do arquivo, e recebendo como retorno o hash gerado…
Faço isso:
GeraHash(arquivo1.getAbsolutePath());
??? correto a chamada da classe com o endereço do arquivo como parâmetro?
e o retorno?
Desde já agradeço…
publicstaticStringgeraHash(Filef)throwsNoSuchAlgorithmException,FileNotFoundException{MessageDigestdigest=MessageDigest.getInstance("MD5");InputStreamis=newFileInputStream(f);byte[]buffer=newbyte[8192];intread=0;Stringoutput=null;try{while((read=is.read(buffer))>0){digest.update(buffer,0,read);}byte[]md5sum=digest.digest();BigIntegerbigInt=newBigInteger(1,md5sum);output=bigInt.toString(16);System.out.println("MD5: "+output);}catch(IOExceptione){thrownewRuntimeException("Não foi possivel processar o arquivo.",e);}finally{try{is.close();}catch(IOExceptione){thrownewRuntimeException("Não foi possivel fechar o arquivo",e);}}returnoutput;}
o retorno é uma String com o código MD5.
[]'s
C
Computeiro
Vlw Mario… vou tentar aqui…
Brigadão mesmo…
C
Computeiro
E aí Mario... blz... cara... tentei aqui mas naum deu certo hein... dá o seguinte erro:
cannot find symbol method GeraHash(java.io.File)
Tenho os dois arquivos(classes) java diferentes... preciso passar o endereço do arquivo selecionado em "TelaArquivo" dentro da condição "if" para a classe(arquivo) "GeraHash"... e pegar o retorno do hash em "TelaArquivo"...
Se puder me ajudar... agradeço desde já...
Arquivo "TelaArquivo.java"
importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjavax.swing.*;publicclassTelaArquivoextendsJFrame{privateJTextFieldtext1privateJButtonbutton1publicTelaArquivo(){//.....//.....TrataBotaobotao=newTrataBotao();button1.addActionListener(botao);}privateclassTrataBotaoimplementsActionListener,KeyListener{publicvoidactionPerformed(ActionEvente){if(e.getSource()==button1){JFileChooserarq1=newJFileChooser();// seleciona qualquer tipo de arquivoarq1.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);intcaminho1=arq1.showOpenDialog(null);if(caminho1==JFileChooser.APPROVE_OPTION){Filearquivo1=arq1.getSelectedFile();text1.setText(arquivo1.getAbsolutePath());//Chama a classe "GeraHash.java", passando como parâmetro o endereço do arquivoGeraHash(arquivo1);//PRECISO PEGAR O "OUTPUT" AQUI!!! }elseJOptionPane.showMessageDialog(null,"Você não selecionou nenhum diretório.");}}publicvoidkeyPressed(KeyEvente){}publicvoidkeyReleased(KeyEvente){}publicvoidkeyTyped(KeyEvente){}}}
Arquivo "GeraHash.java"
importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjavax.swing.*;publicclassGeraHash{publicstaticStringGeraHash(Filef)throwsNoSuchAlgorithmException,FileNotFoundException{MessageDigestdigest=MessageDigest.getInstance("MD5");InputStreamis=newFileInputStream(f);byte[]buffer=newbyte[8192];intread=0;Stringoutput=null;try{while((read=is.read(buffer))>0){digest.update(buffer,0,read);}byte[]md5sum=digest.digest();BigIntegerbigInt=newBigInteger(1,md5sum);output=bigInt.toString(16);System.out.println("MD5: "+output);}catch(IOExceptione){thrownewRuntimeException("Não foi possivel processar o arquivo.",e);}finally{try{is.close();}catch(IOExceptione){thrownewRuntimeException("Não foi possivel fechar o arquivo",e);}}returnoutput;}}
O q estou fazendo de errado??? :cry:
M
mario.fts
sua classe
importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjava.security.NoSuchAlgorithmException;importjavax.swing.*;publicclassTelaArquivoextendsJFrame{privateJTextFieldtext1;privateJButtonbutton1;publicTelaArquivo(){//.....//.....TrataBotaobotao=newTrataBotao();button1.addActionListener(botao);}privateclassTrataBotaoimplementsActionListener,KeyListener{publicvoidactionPerformed(ActionEvente){if(e.getSource()==button1){JFileChooserarq1=newJFileChooser();// seleciona qualquer tipo de arquivoarq1.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);intcaminho1=arq1.showOpenDialog(null);if(caminho1==JFileChooser.APPROVE_OPTION){Filearquivo1=arq1.getSelectedFile();text1.setText(arquivo1.getAbsolutePath());Stringhash=null;try{//Chama a classe "HashMaker.java", passando como parâmetro o endereço do arquivohash=HashMaker.geraHash(arquivo1);}catch(NoSuchAlgorithmExceptione1){// TODO Auto-generated catch blocke1.printStackTrace();}catch(FileNotFoundExceptione1){// TODO Auto-generated catch blocke1.printStackTrace();}//PRECISO PEGAR O "OUTPUT" AQUI!!!//O RETORNO ESTÁ NA VARIÁVEL "hash"}elseJOptionPane.showMessageDialog(null,"Você não selecionou nenhum diretório.");}}publicvoidkeyPressed(KeyEvente){}publicvoidkeyReleased(KeyEvente){}publicvoidkeyTyped(KeyEvente){}}}
Classe que gera o hash
importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStream;importjava.math.BigInteger;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;publicclassHashMaker{publicstaticStringgeraHash(Filef)throwsNoSuchAlgorithmException,FileNotFoundException{MessageDigestdigest=MessageDigest.getInstance("MD5");InputStreamis=newFileInputStream(f);byte[]buffer=newbyte[8192];intread=0;Stringoutput=null;try{while((read=is.read(buffer))>0){digest.update(buffer,0,read);}byte[]md5sum=digest.digest();BigIntegerbigInt=newBigInteger(1,md5sum);output=bigInt.toString(16);System.out.println("MD5: "+output);}catch(IOExceptione){thrownewRuntimeException("Não foi possivel processar o arquivo.",e);}finally{try{is.close();}catch(IOExceptione){thrownewRuntimeException("Não foi possivel fechar o arquivo",e);}}returnoutput;}}
vc tava chamando o geraHash como se ele fosse um método da classe TelaArquivo, mas ele estava em uma classe separada.
Também alterei o nome da sua classe que faz o hash, pq o nome do método tava igual ao nome da classe (podia ser confundido com o construtor da classe.
[]'s
C
Computeiro
Vlw mesmo pela força aí Mario… vou continuar aqui nesse problema… e se tudo correr bem… VOU CONSEGUIR… \o/…
L
lcallero
Ae Mário,
Valeu pela contribuição, igualmente ao Computeiro. As vezes a dúvida de um é a mesma de outro, desta forma multiplicamos o conhecimento.
Obrigado.