Quiero buscar un archivo (sin saber el nombre completo) en un directorio específico utilizando Java NIO y pegote.
public static void match(String glob, String location) throws IOException {
final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher(
glob);
Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path path,
BasicFileAttributes attrs) throws IOException {
if (pathMatcher.matches(path)) {
System.out.println(path);
}
return FileVisitResult.CONTINUE;
}
});
}
Al leer algunos tutorial que hice esto. Sólo quiero volver cadena si encuentro archivo (primero) con la cadena pegote dado.
if (pathMatcher.matches(path)) {
return path.toString();
}
Hay dos cosas que hay que modificar:
A " archivo de encontrar (primero) con pegote dado cuerda " que necesita para terminar recorrer el árbol si se encuentra el archivo, por lo que si se da una coincidencia. Y que necesita para almacenar la ruta coincidente como resultado. El resultado de la Files.walkFileTree
misma es el "el archivo de partida" ( JavaDoc ). Esa es una Path
que apunta al location
.
public static String match(String glob, String location) throws IOException {
StringBuilder result = new StringBuilder();
PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher(glob);
Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
if (pathMatcher.matches(path)) {
result.append(path.toString());
return FileVisitResult.TERMINATE;
}
return FileVisitResult.CONTINUE;
}
});
return result.toString();
}
Si no hay ninguna coincidencia, entonces el resultante String
está vacía.
EDIT:
Usando Files.walk
podemos llevar a cabo la búsqueda con menos código sigue utilizando una expresión basada en coincidencias de glob:
public static Optional<Path> match(String glob, String location) throws IOException {
PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher(glob);
return Files.walk(Paths.get(location)).filter(pathMatcher::matches).findFirst();
}
El Optional
como espectáculos resultado de que no puede haber ninguna coincidencia.