Inicial > programação > Como filtrar apenas um tipo de arquivo ao listar conteúdo de uma pasta

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.

Anúncios
  1. Fernandes
    03/08/2011 às 18:10

    Puxa eu tô procurando algo no sentido de permitir gravação de apenas um tipo de arquivo com extensão numa pasta e assim negar os que não tem extensão o que seja diferente.
    Exemplo: na pasta c:\teste ser possível apenas *.txt. E negar tudo que seja diferente.
    Bom, com no publicado nesta pasta vou tentar fazer. Mas se alguém tiver uma idéia ou souber por favor comenta resultado. OBG

  2. Fernandes
    03/08/2011 às 18:13

    Puxa eu tô procurando algo no sentido de permitir gravação de apenas um tipo de arquivo com extensão numa pasta e assim negar os que não tem extensão o que seja diferente.
    Exemplo: na pasta c:\teste ser possível apenas *.txt. E negar tudo que seja diferente.
    Bom, com no publicado nesta pasta vou tentar fazer. Mas se alguém tiver uma idéia ou souber por favor comenta resultado. OBG

    Fernandes :
    Puxa eu tô procurando algo no sentido de permitir gravação de apenas um tipo de arquivo com extensão numa pasta e assim negar os que não tem extensão o que seja diferente.
    Exemplo: na pasta c:\teste ser possível apenas *.txt. E negar tudo que seja diferente.
    Bom, com no publicado nesta pasta vou tentar fazer. Mas se alguém tiver uma idéia ou souber por favor comenta resultado. OBG

    Na verdade este algoritimo estará monitorando esta pasta, tabalhando com o sistema operacional. E assim cumprindo essa função para com qualquer aplicativo ou programa que tente gravar arquivo não condizente. OBG

  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: