- 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:
- o caminho inicial em start,
- as opções. atualmente somente existe FOLLOW_LINKS
- 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.
- 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".