Gerar hash de arquivo

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…

public void actionPerformed(ActionEvent e) 
{
   	if (e.getSource() == button1)
    {	
		JFileChooser arq1 = new JFileChooser();

		// seleciona qualquer tipo de arquivo
		arq1.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
					
		int caminho1 = arq1.showOpenDialog(null);
	
		if(caminho1 == JFileChooser.APPROVE_OPTION)
		{
			File arquivo1 = 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?
		}
		else
			JOptionPane.showMessageDialog(null, "Você não selecionou nenhum diretório.");
    }	        
    else if (e.getSource() == button2)
    {
          //mesma coisa do button1
          //Jtextfield pega o endereço do arquivo2... 
    }
}
public static void main(String[] args) throws NoSuchAlgorithmException, FileNotFoundException {
	MessageDigest digest = MessageDigest.getInstance("MD5");
	File f = new File("c:\\myfile.txt");
	InputStream is = new FileInputStream(f);				
	byte[] buffer = new byte[8192];
	int read = 0;
	try {
		while( (read = is.read(buffer)) > 0) {
			digest.update(buffer, 0, read);
		}		
		byte[] md5sum = digest.digest();
		BigInteger bigInt = new BigInteger(1, md5sum);
		String output = bigInt.toString(16);
		System.out.println("MD5: " + output);
	}
	catch(IOException e) {
		throw new RuntimeException("Unable to process file for MD5", e);
	}
	finally {
		try {
			is.close();
		}
		catch(IOException e) {
			throw new RuntimeException("Unable to close input stream for MD5 calculation", e);
		}
	}		
}

é o primeiro link… [google]md5 java file[/google]

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…

Melhor usar uma solução mais orientada a objetos:

File arquivo = new File ("c:/teste.txt");

geraHash(arquivo);

o código da geraHash ficaria assim:[code] public static String geraHash(File f) throws NoSuchAlgorithmException, FileNotFoundException{
MessageDigest digest = MessageDigest.getInstance(“MD5”);
InputStream is = new FileInputStream(f);
byte[] buffer = new byte[8192];
int read = 0;
String output = null;
try {
while( (read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
System.out.println("MD5: " + output);
}
catch(IOException e) {
throw new RuntimeException(“Não foi possivel processar o arquivo.”, e);
}
finally {
try {
is.close();
}
catch(IOException e) {
throw new RuntimeException(“Não foi possivel fechar o arquivo”, e);
}
}

	return output;

}

[/code]

o retorno é uma String com o código MD5.

[]'s

Vlw Mario… vou tentar aqui… :smiley:
Brigadão mesmo…

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”

[code]
import java.awt.;
import java.awt.event.
;
import java.io.;
import javax.swing.
;

public class TelaArquivo extends JFrame
{
private JTextField text1
private JButton button1

public TelaArquivo()
{	
	//.....
	//.....
	
	TrataBotao botao = new TrataBotao();    
	button1.addActionListener(botao);     	
}

private class TrataBotao implements ActionListener, KeyListener
{ 		
    public void actionPerformed(ActionEvent e) 
    {
    	if (e.getSource() == button1)
    	{	
			JFileChooser arq1 = new JFileChooser();

			// seleciona qualquer tipo de arquivo
			arq1.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
				
			int caminho1 = arq1.showOpenDialog(null);

			if(caminho1 == JFileChooser.APPROVE_OPTION)
			{
				File arquivo1 = arq1.getSelectedFile();
				text1.setText(arquivo1.getAbsolutePath());				 

				//Chama a classe "GeraHash.java", passando como parâmetro o endereço do arquivo
				GeraHash(arquivo1);
				
				
				//PRECISO PEGAR O "OUTPUT" AQUI!!!																				
			}
			else
				JOptionPane.showMessageDialog(null, "Você não selecionou nenhum diretório.");
    	}	      
    }
    
    public void keyPressed(KeyEvent e){	    		    	    		    	
    }	    	    
    public void keyReleased(KeyEvent e){
    }	    
    public void keyTyped(KeyEvent e){
    }	                	    
}

}[/code]

Arquivo “GeraHash.java”

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.swing.*;

public class GeraHash
{
	public static String GeraHash(File f) throws NoSuchAlgorithmException, FileNotFoundException
	{   
    	MessageDigest digest = MessageDigest.getInstance("MD5");   
    	InputStream is = new FileInputStream(f);                   
    	byte[] buffer = new byte[8192];   
    	int read = 0;   
    	String output = null;   
	    try 
	    {   
        	while( (read = is.read(buffer)) > 0) 
        	{   
            	digest.update(buffer, 0, read);   
        	}         
        	byte[] md5sum = digest.digest();   
        	BigInteger bigInt = new BigInteger(1, md5sum);   
        	output = bigInt.toString(16);   
        	System.out.println("MD5: " + output);   
    	}   
    	catch(IOException e) 
    	{   
        	throw new RuntimeException("Não foi possivel processar o arquivo.", e);   
    	}   
	    finally 
	    {   
        	try 
        	{   
            	is.close();   
        	}   
        	catch(IOException e) 
        	{   
            	throw new RuntimeException("Não foi possivel fechar o arquivo", e);   
        	}   
    	}     
       
    	return output;     
	} 
}

O q estou fazendo de errado??? :cry:

sua classe

[code]import java.awt.;
import java.awt.event.
;
import java.io.*;
import java.security.NoSuchAlgorithmException;

import javax.swing.*;

public class TelaArquivo extends JFrame
{
private JTextField text1;
private JButton button1;

public TelaArquivo()
{
	//.....
	//.....

	TrataBotao botao = new TrataBotao();
	button1.addActionListener(botao);
}

private class TrataBotao implements ActionListener, KeyListener
{
    public void actionPerformed(ActionEvent e)
    {
    	if (e.getSource() == button1)
    	{
			JFileChooser arq1 = new JFileChooser();

			// seleciona qualquer tipo de arquivo
			arq1.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

			int caminho1 = arq1.showOpenDialog(null);

			if(caminho1 == JFileChooser.APPROVE_OPTION)
			{
				File arquivo1 = arq1.getSelectedFile();
				text1.setText(arquivo1.getAbsolutePath());
				String hash = null;


				try {
					//Chama a classe "HashMaker.java", passando como parâmetro o endereço do arquivo
					hash = HashMaker.geraHash(arquivo1);
				} catch (NoSuchAlgorithmException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}


				//PRECISO PEGAR O "OUTPUT" AQUI!!!
				//O RETORNO ESTÁ NA VARIÁVEL "hash"
			}
			else
				JOptionPane.showMessageDialog(null, "Você não selecionou nenhum diretório.");
    	}
    }

    public void keyPressed(KeyEvent e){
    }
    public void keyReleased(KeyEvent e){
    }
    public void keyTyped(KeyEvent e){
    }
}

}[/code]

Classe que gera o hash

[code]import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashMaker
{
public static String geraHash(File f) throws NoSuchAlgorithmException, FileNotFoundException
{
MessageDigest digest = MessageDigest.getInstance(“MD5”);
InputStream is = new FileInputStream(f);
byte[] buffer = new byte[8192];
int read = 0;
String output = null;
try
{
while( (read = is.read(buffer)) > 0)
{
digest.update(buffer, 0, read);
}
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
System.out.println("MD5: " + output);
}
catch(IOException e)
{
throw new RuntimeException(“Não foi possivel processar o arquivo.”, e);
}
finally
{
try
{
is.close();
}
catch(IOException e)
{
throw new RuntimeException(“Não foi possivel fechar o arquivo”, e);
}
}

	return output;
}

}
[/code]

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

Vlw mesmo pela força aí Mario… vou continuar aqui nesse problema… e se tudo correr bem… VOU CONSEGUIR… \o/… :smiley:

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.