Análisis de la utilidad Files.walkFileTree ();

Al no haber encontrado en ninguna parte una descripción explicativa en ruso, qué tipo de bestia Files.walkFileTree () , y haberlo dominado con un chirrido, como resultó más tarde, una funcionalidad simple, decidí compartir el material con ejemplos como parte de la fijación, que realmente extrañé.

El método walkFileTree () le permite omitir el árbol de archivos y subdirectorios de la ruta ...

Dos firmas de método

Files.walkFileTree(Path start, FileVisitor<? super Path> visitor); Files.walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor); 

Donde
Inicio de ruta: el directorio cuyo contenido se debe omitir,
Visitante FileVisitor: una instancia de una clase que implementa la interfaz FileVisitor o que hereda de SimpleFileVisitor (). Este último, en mi opinión, es más conveniente de usar cuando no necesita redefinir todos los métodos de FileVisitor (), que se discutirán a continuación (pero depende de la situación),
Establecer opciones de <\ FileVisitOption>: un conjunto de opciones que determinan el comportamiento al rastrear,
maxDepth: profundidad de paso de subdirectorios.

Primero, sobre los parámetros que serán útiles tarde o temprano.

maxDepth : profundidad transversal. En = 0, la entrada en el directorio no se realizará, en = MAX_VALUE el directorio se examinará hasta la profundidad máxima, respectivamente, con maxDepth = 3, el pasaje se realizará en 3 subdirectorios "abajo".

FileVisitOption : enum es un conjunto que determina si el programa debe seguir enlaces simbólicos al rastrear (en este caso, se especifica el valor FileVisitOption.FOLLOW_LINKS).

FileVisitor : una interfaz que tiene 4 métodos:

1) FileVisitResult preVisitDirectory (T dir, BasicFileAttributes attrs) arroja IOException;
incluye un conjunto de métodos que deben seguirse antes de visitar el subdirectorio actual. Por ejemplo, a través de los atributos puede obtener datos como:
lastModifiedTime (),
lastAccessTime (),
creationTime (),
isRegularFile (): verdadero si tenemos un archivo frente a nosotros,
isDirectory (): verdadero si tenemos un directorio
isSymbolicLink (): verdadero si el objeto es un enlace,
isOther (): verdadero si el objeto en cuestión no es un archivo, ni un directorio, ni un enlace,
size (): devuelve el tamaño del objeto y
fileKey (): devuelve una clave de archivo o nulo;

Si planea contar el número de directorios durante el rastreo, no debe olvidar que el directorio de inicio también se tendrá en cuenta en la cantidad total.

2) FileVisitResult visitFile (archivo T, BasicFileAttributes attrs) arroja IOException;
un conjunto de métodos que se deben realizar mientras se visita el archivo actual (por ejemplo, puede profundizar en su contenido y buscar ocurrencias de la cadena de búsqueda, o nuevamente encontrar la fecha de la última visita, cambiar el archivo o agregar el tamaño de todos los archivos para rastrear para obtener el tamaño del directorio)

Ejemplo

 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; } 

En este ejemplo, al atravesar el árbol de archivos, se verifica la ejecución simultánea de 2 eventos en cada archivo: si el nombre del archivo contiene la entrada deseada y si el archivo contiene entradas de la cadena requerida. Cuando se cumplen ambas condiciones, el archivo se agrega a la hoja resultante, después de lo cual el rastreo continúa;

U otro ejemplo de la sobrecarga del 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; } 

El programa durante un recorrido de árbol cuando visita un archivo, en caso de que sea un archivo zip o rar, agrega su dirección (ruta) como una cadena a la lista de archivos;

3) FileVisitResult visitFileFailed (archivo T, IOException exc) arroja IOException;
Este método puede ser útil cuando el acceso a un archivo no tiene éxito + "puede" lanzar una excepción. El resto se puede enseñar a través de la anotación de anulación. Por ejemplo, calcule la cantidad de archivos a los que no se pudo acceder;

Ejemplo

 @Override public FileVisitResult visitFileFailed(Path path, IOException exc) throws IOException { failed.add(path.toString()); return FileVisitResult.SKIP_SUBTREE; } 

En el caso de un intento fallido de acceder a la ruta, esta ruta se agrega como una cadena a la lista fallida de otras similares, y el programa continúa omitiendo sin visitar su subdirectorio;

4) FileVisitResult postVisitDirectory (T dir, IOException exc) arroja IOException;
todo lo que debe hacerse después de visitar el directorio debe aparecer como parte de la sobrecarga de este método. Por ejemplo, al recorrer un directorio y destruir todos los archivos que contiene, este método también puede destruirlo por sí mismo (recordamos que Files.delete (Path dir) elimina el directorio solo si está vacío y no contiene archivos).

Ejemplo

 @Override public FileVisitResult postVisitDirectory(Path path, IOException exc) throws IOException { Files.delete(path); return FileVisitResult.CONTINUE; } 

Todos los métodos descritos anteriormente se completan devolviendo los "resultados de la visita" (FileVisitResult) del objeto que pertenece al conjunto de enumeraciones y pueden tomar los siguientes valores:

  1. CONTINUE - continúa atravesando el árbol;
  2. TERMINATE - termina el recorrido del árbol;
  3. SKIP_SUBTREE - continúa SKIP_SUBTREE , sin ir a este directorio;
  4. SKIP_SIBLINGS : excluye el rastreo de los "familiares" de este archivo o directorio;

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


All Articles