Análise do utilitário Files.walkFileTree ();

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étodo

Files.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:

  1. CONTINUE - continua atravessando a árvore;
  2. TERMINATE - finaliza a travessia da árvore;
  3. SKIP_SUBTREE - continua ignorando, sem SKIP_SUBTREE este diretório;
  4. SKIP_SIBLINGS - exclui o rastreamento dos "parentes" deste arquivo ou diretório;

Source: https://habr.com/ru/post/pt437694/


All Articles