Arquivo

Posts Tagged ‘File’

Como filtrar apenas um tipo de arquivo ao listar conteúdo de uma pasta

Essa semana me deparei com um problema: eu precisava listar os arquivos com extensão jpg de uma pasta, mas não queria fazer um laço na minha aplicação que percorreria todos os arquivos retornados pelo método listFiles(), da classe File, e retiraria do array aqueles que não atendessem meus requisitos (no caso, os arquivos que não tivessem a extensão desejada).

O código dessa implementação ficaria assim:

   File diretorioDeImagens = new File("C:\\temp");

   // Listo todos os arquivos do diretório
   File[] imagensDoDiretorio = diretorioDeImagens.listFiles();
   List<File> arquivos = new ArrayList<File>();

   // Jogo no ArrayList apenas os que possuem extensão 'jpg'
   for (int i=0; i<imagensDoDiretorio.length; i++) {
      if (imagensDoDiretorio[i].getName().endsWith("jpg")) {
         arquivos.add(imagensDoDiretorio[i]);
      }
   }

   // A partir do ArrayList gero um Array de arquivos (File)
   imagensDoDiretorio = (File[]) arquivos.toArray();

É claro que a solução acima funciona, porém a solução mais apropriada, elegante e robusta seria utilizar a classe FileFilter como classe interna local de método ao invocar listFiles(). Além de o código ficar menor, demonstra que você sabe programar bem em Java, porque este é um recurso pouco utilizado, mas que se encaixa perfeitamente na solução que queremos dar. Veja como fica:

   File diretorioDeImagens = new File("C:\\temp");

   // Listo todos os arquivos do diretório, excluindo os que terminam com txt
   File[] imagensDoDiretorio = diretorioDeImagens.listFiles(
               new FileFilter() {
                  public boolean accept(File b){
                     return b.getName().endsWith(".jpg");
                  }
               }
            );

Observem que estou chamando o método listFiles() da classe File, passando uma classe que extende FileFilter, que é uma classe abstrata. É por isso que temos que implementar o método accept() de FileFilter que é um método abstrato. Mas você pode estar se perguntando: como podemos dar um new em FileFilter se ela é abstrata? Quando definimos FileFilter dessa forma, estamos criando um classe anônima – nesse caso chamada de classe interna local de método – que extende FileFilter, portanto, o código acima é válido.