Recursividade de metodo

7 respostas
gqferreira

Olá pessoal!

Estou tendo um problema com metodos recursivos, fiz um exemplo aqui:

import java.io.File;

public class Teste {

	public static void main(String[] args) {
		getFilesRecursivo(new File("/home/gustavo/TESTE"));
	}
	public static void getFilesRecursivo(File diretorio)
	{
		File[] file = diretorio.listFiles();

		if (file!=null)	
		{
			for (int i = 0; i < file.length;i++)
			{
				if (!file[i].isDirectory())
				{
						if (file[i].getName().toLowerCase().equals("txt"))
						{
							System.out.println("O caminho do arquivo procurado e: "+file[i].getAbsoluteFile());
							break; //PRESTE ATENCAO NESSE BREAK
						}
				}
				else
				{
					getFilesRecursivo(file[i]);
				}
			}
		}
	}
}

A ideia era que ao encontrar o primeiro arquivo com o tal nome, o metodo fosse ‘decapitado’ . Pelo que eu sei, quando vc chama o proprio metodo de novo é como se vc tivesse outro igualzinho mas no mesmo codigo, ou seja o mesmo. A diferenca é que com o mesmo codigo ele gera varias instancias do metodo, o que ta acontecendo é que o break mata a instancia atual (nao se auto-chama mais), mas dai ele volta para a antiga e continua… como resolver isso?

:thumbup: :thumbup:

7 Respostas

gqferreira
Solucionei dessa forma:
import java.io.File;

public class Teste {

	private boolean encontrado=false;
	public static void main(String[] args) {
		Teste teste = new Teste();
		teste.getFilesRecursivo(new File("/home/gustavo/TESTE"));
	}
	private void getFilesRecursivo(File diretorio)
	{
		File[] file = diretorio.listFiles();

		if (file!=null)	
		{
			for (int i = 0; i < file.length;i++)
			{
				if (encontrado)
					break;
				else if (!file[i].isDirectory())
				{
						if (file[i].getName().toLowerCase().equals("txt"))
						{
							System.out.println("O caminho do arquivo procurado e: "+file[i].getAbsoluteFile());
							encontrado=true;
						}
				}
				else
				{
					getFilesRecursivo(file[i]);
				}
			}
		}
	}
}
Mas assim tive que criar uma variavel a mais, se eu nao conseguir de outro jeito acho que vai ficar assim.
davidbuzatto

Oi Gustavo,

Dei uma melhorada no seu código. Na verdade vc não precisa parar a recursão, um arquivo com o mesmo nome pode existir em diversos subdiretórios. Dá uma olhada.
import java.io.*;
import java.util.*;

public class Teste {

    
    public static void main( String[] args ) {
        
        Teste teste = new Teste();
        List<File> arquivos = teste.getFiles( new File( "/home/gustavo/TESTE" ), "txt" );
        
        if ( arquivos.size() == 0 ) {
            System.out.println( "Nenhum arquivo encontrado." );
        } else {
            for ( File f : arquivos ) {
                System.out.println( "O caminho é: " + f.getAbsolutePath() );
            }
        }
        
    }
    
    /*
     * Obtéma lista de arquivos (pode haver mais de um arquivo com o mesmo nome em um subdiretório.
     */
    public List<File> getFiles( File diretorio, String nomeArquivo ) {
        
        List<File> arquivos = new ArrayList<File>();
        
        // a lista de arquivos passada é populada dentro do método
        getFilesRecursivo( diretorio, nomeArquivo, arquivos );
        
        return arquivos;
        
    }
    
    /*
     * Método recursivo para a obtenção dos arquivos.
     */
    private void getFilesRecursivo( File diretorio, String nomeArquivo, List<File> lista ) {
        
        if ( diretorio.listFiles() == null )   
            return;
            
        for ( File f : diretorio.listFiles() ) {
            
            if ( !f.isDirectory() ) {
                if ( f.getName().equals( nomeArquivo ) ) {
                    lista.add( f );
                }
            } else {
                getFilesRecursivo( f, nomeArquivo, lista );
            }
            
        }
            
    }
    
}
[]´s
rimarck
public static void main(String[] args) {
        Teste.getFilesRecursivo(new File("/home/gustavo/TESTE"), "txt");
    }

    public static void getFilesRecursivo(File file, String nomeArquivo) {
        if (file.isDirectory()) {
            for (File subFile : file.listFiles()) {
                getFilesRecursivo(subFile, nomeArquivo);
            }
        } else if (file.getName().toLowerCase().indexOf(nomeArquivo) != -1) {
            System.out.println("O caminho do arquivo procurado e: " + file.getAbsoluteFile());
        }
    }
gqferreira

É … eu fiz assim antes mas o ‘lance’ de ter um metodo que retorna um List contendo o nome de todos os arquivos encontrados pode dar problema, fiz um teste indicando o diretorio /home, e como vc sabe, existem muitos arquivos e o List ficou tao grande que deu “java heap space”… pau de memoria… entao fiz com que a medida que vou listando vou verificando e crio um list somente com os encontrados, assim nao tenho que armazenar um list gigante com todos os files encontrado no diretorio a ser pesquisado. Mas um criterio de pesquisa que desejo é parar a pesquisa assim que encontrar o primeiro. Sei que pode haver varios com o mesmo nome, mas por exemplo:

Sei que existe somente um arquivo GUSTAVO.txt em /home…, entao nao precisa continuar o massacre do processador tentando achar outro…

rimarck

Se você quiser so achar 1 arquivo:

public static void main(String[] args) {  
        Teste.getFilesRecursivo(new File("/home/gustavo/TESTE"), "txt");  
    }

    public static boolean getFilesRecursivo(File file, String nomeArquivo) {
        if (file.isDirectory()) {
            for (File subFile : file.listFiles()) {
                if (getFilesRecursivo(subFile, nomeArquivo)) {
                    return true;
                }
            }
        } else if (file.getName().toLowerCase().indexOf(nomeArquivo) != -1) {
            System.out.println("O caminho do arquivo procurado e: " + file.getAbsoluteFile());
            return true;
        }
        
        return false;
    }
denirroberto
davidbuzatto:
Oi Gustavo, Dei uma melhorada no seu código. Na verdade vc não precisa parar a recursão, um arquivo com o mesmo nome pode existir em diversos subdiretórios. Dá uma olhada.
import java.io.*;
import java.util.*;

public class Teste {

    
    public static void main( String[] args ) {
        
        Teste teste = new Teste();
        List<File> arquivos = teste.getFiles( new File( "/home/gustavo/TESTE" ), "txt" );
        
        if ( arquivos.size() == 0 ) {
            System.out.println( "Nenhum arquivo encontrado." );
        } else {
            for ( File f : arquivos ) {
                System.out.println( "O caminho é: " + f.getAbsolutePath() );
            }
        }
        
    }
    
    /*
     * Obtéma lista de arquivos (pode haver mais de um arquivo com o mesmo nome em um subdiretório.
     */
    public List<File> getFiles( File diretorio, String nomeArquivo ) {
        
        List<File> arquivos = new ArrayList<File>();
        
        // a lista de arquivos passada é populada dentro do método
        getFilesRecursivo( diretorio, nomeArquivo, arquivos );
        
        return arquivos;
        
    }
    
    /*
     * Método recursivo para a obtenção dos arquivos.
     */
    private void getFilesRecursivo( File diretorio, String nomeArquivo, List<File> lista ) {
        
        if ( diretorio.listFiles() == null )   
            return;
            
        for ( File f : diretorio.listFiles() ) {
            
            if ( !f.isDirectory() ) {
                if ( f.getName().equals( nomeArquivo ) ) {
                    lista.add( f );
                }
            } else {
                getFilesRecursivo( f, nomeArquivo, lista );
            }
            
        }
            
    }
    
}
[]´s

Maravilha Gustavo excelente dica, mas estou com um problema, consigo apenas listar todos os arquivos a intenção é listar somente as pastas tem como? Tentei tirar o diferente de !f.isDirectory() mas nada feito, consigo diferenciar se é oculto ou não mas não consigo trazer os diretórios e subdiretorios. Ah, tem como criar edentação também, estou usando java web jee 6.

Obrigado

denirroberto

Bom já que ninguém pode me ajudar resolvi sozinho.

Criado 31 de dezembro de 2009
Ultima resposta 23 de mar. de 2012
Respostas 7
Participantes 4