quarta-feira, 27 de fevereiro de 2013

Utilizando FileVisitor

Neste post vou mostrar como seguir por uma árvore de diretórios procurando um conjunto de arquivos que atendam ao padrão de pesquisa passado como segundo argumento na linha de comando. Para que nosso exemplo funcione utilizamos de dois recursos:
  • Files.walkFileTree
    • este é um método estático de Files (quer dizer que não temos que chamar new Files() para poder chamá-lo)
    • a assinatura do método é
walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor)
    • informamos portanto:
    1. o caminho inicial em start,
    2. as opções. atualmente somente existe FOLLOW_LINKS
    3. maxDepth que indica a profundidade na subárvore de diretórios que iremos realizar a busca. Se colocarmos este valor igual a zero, os subdiretórios dentro de start não serão pesquisados.
    4. a nossa classe que implementa FileVisitor
  • a interface FileVisitor
    • a classe que implementa esta interface é utilizada para tratar cada arquivo localizado durante a pesquisa e possui 4 métodos que são chamados na medida que é realizada a busca na estrutura de diretórios
      • preVisitDirectory: é chamado quando entramos o diretório e ainda nenhum dos itens deste diretório (arquivos ou subdiretórios que estão dentro dele) foi analisado
      • visitFile: é chamado quando uma entrada em um diretório (seja ela um arquivo, um link ou um subdiretório) é analisado
      • postVisitDirectory: é chamado depois que todos os arquivos e subdiretórios deste diretório foram analisados e imediatamente antes de sair dele para analisar o próximo
      • visitFileFailed


Vamos a nossa classe completa:

Aqui esta a implementação de FileVisitor como uma classe contida no mesmo arquivo da nossa classe principal Find. Basicamente utilizamos 2 métodos da interface:

  • visitFile: é utilizado para apresentar um arquivo na estrutura de diretórios que atende ao padrão indicado
  • preVisitDirectory: é utilizado para apresentar um diretório que atende ao padrão


Vamos rodar agora para simular as nossas buscas:

  • java Find
  • java Find . "*.java"
  • java Find . "*.java~"


Tentem rodar por exemplo java Find / "*.java", você vai receber um erro. O problema é que o caracter / é um caracter especial. Para procurar a partir do raiz temos que usar um subterfúgio... chamamos java Find /. "*.java".

Nenhum comentário:

Postar um comentário