Como não encontrei em nenhum lugar uma descrição explicativa em russo, que
tipo de besteira Files.walkFileTree () e a dominei com um guincho, como se viu depois, uma funcionalidade simples, decidi compartilhar o material com exemplos como parte da fixação, o que realmente senti falta.
O método walkFileTree () permite ignorar a árvore de arquivos e subdiretórios passados a ele como um parâmetro do elemento Path ...
Duas assinaturas de métodoFiles.walkFileTree(Path start, FileVisitor<? super Path> visitor); Files.walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor);
Onde
Path start - o diretório cujo conteúdo deve ser ignorado,
Visitante FileVisitor - uma instância de uma classe implementando a interface FileVisitor ou herdada de SimpleFileVisitor (). Este último, na minha opinião, é mais conveniente de usar quando você não precisa redefinir todos os métodos FileVisitor (), que serão discutidos um pouco mais tarde (mas depende da situação),
Definir opções <\ FileVisitOption> - um conjunto de opções que determinam o comportamento ao rastrear,
maxDepth - profundidade de passagem dos subdiretórios.
Primeiro, sobre os parâmetros que serão úteis mais cedo ou mais tarde.maxDepth - profundidade de travessia. Em = 0, a entrada no diretório não será executada; em = MAX_VALUE, o diretório será examinado até a profundidade máxima, respectivamente, com maxDepth = 3, a passagem será realizada em 3 subdiretórios “inativos”.
FileVisitOption - enum é um conjunto que determina se o programa deve seguir links simbólicos durante o rastreamento (nesse caso, o valor FileVisitOption.FOLLOW_LINKS é especificado).
FileVisitor - uma interface que possui 4 métodos:
1) FileVisitResult preVisitDirectory (T dir, BasicFileAttributes attrs) lança IOException;inclui um conjunto de métodos que devem ser seguidos antes de visitar o subdiretório atual. Por exemplo, através de attrs, você pode obter dados como:
lastModifiedTime (),
lastAccessTime (),
creationTime (),
isRegularFile () - true se tivermos um arquivo à nossa frente,
isDirectory () - true se tivermos um diretório
isSymbolicLink () - true se o objeto for um link,
isOther () - true se o objeto em questão não for um arquivo, nem um diretório, nem um link,
size () - retorna o tamanho do objeto e
fileKey () - retorna uma chave de arquivo ou nula;
Se você planeja contar o número de diretórios durante o rastreamento, não esqueça que o diretório inicial também será levado em consideração no valor total.
2) O FileVisitResult visitFile (arquivo T, BasicFileAttributes attrs) lança IOException;um conjunto de métodos que devem ser seguidos ao visitar o arquivo atual (por exemplo, você pode pesquisar no conteúdo e procurar ocorrências da sequência de pesquisa ou descobrir novamente a data da última visita, alterar o arquivo ou adicionar o tamanho de todos os arquivos a serem rastreados para obter o tamanho do diretório)
Exemplo public class MyFileVisitor extends SimpleFileVisitor<Path> { String partOfName; String partOfContent; @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { boolean containsName = true; if(partOfName!=null && !file.getFileName().toString().contains(partOfName)) containsName = false; String content = new String(Files.readAllBytes(file)); boolean containsContent = true; if(partOfContent!=null && !content.contains(partOfContent)) containsContent = false; if(containsName && containsContent) foundFiles.add(file); return FileVisitResult.CONTINUE; }
Neste exemplo, ao percorrer a árvore de arquivos, cada arquivo é verificado para execução simultânea de 2 eventos - se o nome do arquivo contém a entrada desejada e se o arquivo contém entradas da sequência necessária. Quando as duas condições são atendidas, o arquivo é adicionado à planilha resultante, após o qual o rastreamento continua;
Ou outro
exemplo da sobrecarga do método visitFile
@Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { if(path.toString().endsWith(".rar") || path.toString().endsWith(".zip")) archived.add(path.toString()); return FileVisitResult.CONTINUE; }
O programa durante uma passagem em árvore ao visitar um arquivo, no caso de ser um arquivo zip ou rar, adiciona seu endereço (caminho) como uma sequência à lista de arquivos;
3) FileVisitResult visitFileFailed (arquivo T, IOException exc) lança IOException;Esse método pode ser útil quando o acesso a um arquivo for malsucedido + "pode" lançar uma exceção. O restante pode ser ensinado através da anotação Substituir. Por exemplo, calcule o número de arquivos que não puderam ser acessados;
Exemplo @Override public FileVisitResult visitFileFailed(Path path, IOException exc) throws IOException { failed.add(path.toString()); return FileVisitResult.SKIP_SUBTREE; }
No caso de uma tentativa malsucedida de acessar o caminho, esse caminho é adicionado como uma sequência à lista de falhas de similares, e o programa continua ignorando sem visitar seu subdiretório;
4) FileVisitResult postVisitDirectory (T dir, IOException exc) lança IOException;tudo o que precisa ser feito depois de visitar o diretório deve ser listado como parte da sobrecarga desse método. Por exemplo, percorrendo um diretório e destruindo todos os arquivos nele, esse método também pode destruí-lo (lembramos que Files.delete (Path dir)) exclui o diretório somente se estiver vazio e não contiver arquivos).
Exemplo @Override public FileVisitResult postVisitDirectory(Path path, IOException exc) throws IOException { Files.delete(path); return FileVisitResult.CONTINUE; }
Todos os métodos descritos acima são concluídos retornando os "resultados da visita" (FileVisitResult) do objeto que pertence ao conjunto de enumerações e pode assumir os seguintes valores:
CONTINUE
- continua atravessando a árvore;TERMINATE
- finaliza a travessia da árvore;SKIP_SUBTREE
- continua ignorando, sem SKIP_SUBTREE
este diretório;SKIP_SIBLINGS
- exclui o rastreamento dos "parentes" deste arquivo ou diretório;