sábado, 12 de noviembre de 2011

Busqueda recursiva

Algo de código java, para no perder la costumbre

Tenemos la necesidad de encontrar todos los archivos cuyo nombre cumple con cierta expresión regular.

La solución es sencilla, pero, requiere recursividad.
Va la solución y, si tienen alguna duda o comentario; ya saben que hacer ;)
Nuestra interface es:

import java.io.IOException;
import java.util.List;

/**
 * Interface principal.
 * @author rugi
 */
public interface ISearchable {
    /**
     * Devuelve una lista de paths (incluyendo el nombre del archivo).
     * Busca a partir de folder de manera recursiva
     * archivos cuyo nombre debe cumplir con el criterio de pattern
     * @param folder
     * @param pattern
     * @return 
     */
    public  List getPathFilesInFolder(String folder, String pattern) throws IOException;
}


Nuestra clase queda:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author rugi
 */
public class SearchFilesUtil implements ISearchable {

    public SearchFilesUtil() {
        super();
    }

    @Override
    public List<String> getPathFilesInFolder(String folder, String pattern) throws IOException {
        List<String> res = new ArrayList<String>();
        if (new File(folder).isDirectory()) {
            searchInFolder(new File(folder), pattern, res);
        } else {
            throw new IOException("El origen proporcionado no es válido.");
        }
        return res;
    }

    private void searchInFolder(File folder, String pattern, List<String> r) {
        File[] fs = folder.listFiles();
        for (File f : fs) {
            if (f.isDirectory()) {
                searchInFolder(f, pattern, r);
            } else {
                if (f.getName().matches(pattern)) {
                    r.add(f.getAbsolutePath());                    
                }
            }
        }
    }
}

Y podemos buscar archivos de la siguiente manera(En este ejemplo buscamos archivos .pdf):

    
public static void main(String[] args) throws IOException {
        SearchFilesUtil sf = new SearchFilesUtil();
        Iterator it = sf.getPathFilesInFolder("/Users/user847/books", "(.*?).pdf").iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }


¡¡¡ Listo !!!

No hay comentarios:

Publicar un comentario