Pesquisar em vários ficheiros do mesmo diretório

Gente, estou precisando de um programa para procurar em vários ficheiros um determinado número, sendo que ele pesquise em todos os arquivos do diretório até encontrar. Eu consegui apenas um código para procurar em um ficheiro já especificado…segue o código:

public static boolean procura() { boolean achou = false; String linha=""; String pal = JOptionPane.showInputDialog("Digite o nome da palavra a procurar:"); try { BufferedReader in = new BufferedReader(new FileReader("teste.txt")); while ((linha = in.readLine()) != null) { if (linha.contains(pal)) { System.out.println(linha); achou = true; } } } catch (Exception e) { System.err.println("Erro na abertura do arquivo "); return achou; } return achou; }

Como sempre, divida seu problema em pedaços - já bem dizia o sr. Jack o Estripador :slight_smile:

  1. Crie uma rotina que, dado um nome de um único arquivo e uma palavra, abra-o e diga se essa palavra está nesse arquivo ou não.
  2. Crie uma rotina que liste os arquivos de um diretório.
  3. Junte a primeira rotina com a segunda.

Dica: http://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles()

Eu segui mais ou menos seu raciocinio, cheguei a essa conclusão sem êxito:

[code]import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import javax.swing.JOptionPane;

public class Busca {
static File arq;

public static boolean procura() {    
    boolean achou = false;    
    String linha="";   
    File arquivos[]; 
	File diretorio = new File("C:\\"); 
	arquivos = diretorio.listFiles(); 
	
		for(int i = 0; i < arquivos.length; i++)
			arq = arquivos[i];
		
    String pal = JOptionPane.showInputDialog("Digite o nome da palavra a procurar:");         
    try {    
        BufferedReader in = new BufferedReader(new FileReader(arq));    
        while ((linha = in.readLine()) != null) {    
            if (linha.contains(pal)) {   
                System.out.println(linha);    
                achou = true;    
            }    
        }    
    } catch (Exception e) {    
        System.err.println("Erro na abertura do arquivo ");    
        return achou;    
    }    
    return achou;    
}     

	public static void main(String[] args){
		procura();
	}

}

[/code]

Poderia me dar uma dica?

Hum…

            for(int i = 0; i < arquivos.length; i++)  
                arq = arquivos[i]; 

Não está faltando algum “{” depois do for?

Mas mesmo com o “}” não me retorna nada, era para me retornar toda a linha

Ai minha Santa Catarina - eu não falei para você botar um for deste jeito errado aqui:

 for(int i = 0; i < arquivos.length; i++)  {
                arq = arquivos[i];
}

A chave que fecha é bem depois , e fica por sua conta descobrir onde é que ela tem de ficar :slight_smile:

Não sei bem, fechando esse for depois, mesmo assim funcione…

Um exemplo do que você deveria fazer. Não compilei o seguinte código :slight_smile:

Dica: Evite ao máximo usar static em classes. Exceções: public static void main e constantes (static final).

import javax.swing.*;  
import java.io.*;
import java.util.*;

/**
 * Evite ao máximo usar static em classes. 
 * Exceções: public static void main e constantes (static final). 
 */
public class Busca {

    public static void main (String[] args) {
		Busca b = new Busca();
		String palavra = JOptionPane.showInputDialog ("Digite a palavra a ser procurada");
		String diretorio = JOptionPane.showInputDialog ("Digite o diretório");
		boolean achou = b.procuraEmDiretorio (palavra, diretorio);
		if (achou) {
			System.out.println ("A palavra foi encontrada");
		} else {
			System.out.println ("A palavra não foi encontrada");
		}
	}
	
	public boolean procuraEmDiretorio (String palavra, String diretorio) {
		String[] arquivos = new File (diretorio).list();
		for (String arquivo : arquivos) {
			boolean achou = procuraEmArquivo (palavra, arquivo);
			if (achou)
				return true; // não precisa procurar mais
		}
		return false; // não achou mesmo
	}
	
	public boolean procuraEmArquivo (String palavra, String arquivo) {
		BufferedReader br = null;
		try {
			br = new BufferedReader (new FileReader (arquivo));
			for (String linha = br.readLine(); linha != null; linha = br.readLine()) {
				if (linha.contains (palavra) {
					return true; 
				}
			}
		} catch (IOException ex) {
		    ex.printStackTrace();
		} finally {
			// Note que o "finally" é executado antes do return - mágicas do Java :)
		    if (br != null) try { br.close(); } catch (IOException ex2) { }
		}
		return false;
	}
}

Dei uma modificada louca, ai agora consigo pesquisar pelo menos no primeiro arquivo e imprimir linha e diretório, mas não consigo acessar os outros ficheiros de forma correta. Alguma luz para isso?

[code]import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JOptionPane;

public class Busca {

@SuppressWarnings("unused")
public static boolean procura() throws IOException {    
    boolean achou = false;    
    String linha="";   
    
    FileFilter filter = new FileFilter() {  
        public boolean accept(File file) {  
            return file.getName().endsWith(".txt");  
        }  
    };  

	File diretorio = new File("C:\\"); 
	File[] arquivos = diretorio.listFiles(filter); 
	
	int len = 0;
	if(arquivos != null)
		len = arquivos.length;
	
	String f;
	for (int i = 0; i < len; i++){
		f = arquivos[i].getName();
	
    String pal = JOptionPane.showInputDialog("Digite o nome da palavra a procurar:");            
        BufferedReader in = new BufferedReader(new FileReader(f));    
        while ((linha = in.readLine()) != null) {    
            if (linha.contains(pal)) {   
                System.out.println(linha); 
                System.out.println(arquivos[i].getName());
                achou = true;  
            } }
	}
	return achou;
	}

	public static void main(String[] args) throws IOException{
		procura();
	}

}

[/code]

Segue um código que mostra apenas a busca nos arquivos.

[code]public static void main(String[] args) throws Exception{
File file = null;
BufferedReader reader = null;
StringBuilder content = null;

	List&lt;File&gt; files = new ArrayList&lt;File&gt;();
	files.add(new File(&quot;/c:/&quot;));
	
	for(int i=0; i&lt;= files.size(); i++) {
		file = files.get(i);
		
		files.addAll(Arrays.asList(file.listFiles()));
		
		if (file.isDirectory())
			continue;
		
		try {
			reader = new BufferedReader(new FileReader(file));

			content = new StringBuilder();
			
			while (reader.ready())
				content.append(reader.readLine());
		
			if (content.indexOf(&quot;string busca&quot;) &gt; 0)
				System.out.println(file.getAbsolutePath());
		} finally {
			if (reader != null)
				reader.close();
		}
	}
}[/code]

Eu fui tentando aqui, ai cheguei nesse código, e pelo menos, está me ajudando na tarefa. Segue código:

[code]import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JOptionPane;

public class listarArquivos {

	public void listarArquivos(String nomeDiretorio) throws IOException{
        
		String linha=""; 
		File diretorio = new File(nomeDiretorio);
		
		File[] fList = diretorio.listFiles();
    	String pal = JOptionPane.showInputDialog("Digite o nome da palavra a procurar:"); 

		for (File file: fList){
			if (file.isFile()){
				  BufferedReader in = new BufferedReader(new FileReader(file.getAbsolutePath())); 
	                
	                while ((linha = in.readLine()) != null) {    
	                    if (linha.contains(pal)) {   
	                        System.out.println(linha); 
	                        System.out.println(file.getName());
	                    }
	                }
			} else if (file.isDirectory()){
				listarArquivos(file.getAbsolutePath());
			}
		}
	}
	
	public static void main(String[] args) throws IOException{
		
		listarArquivos list = new listarArquivos();
		
		final String diretorioWindows = "C:/";
		list.listarArquivos(diretorioWindows);
	}

}
[/code]