reales - Cuándo usar**(estrella doble) en la sintaxis glob dentro de JAVA
numeros reales en java (1)
Directamente de this tutorial de Oracle de Java:
Dos asteriscos, **, funcionan como * pero cruzan los límites del directorio. Esta sintaxis generalmente se usa para unir rutas completas.
¿Alguien podría dar un ejemplo real? ¿Qué significan con "cruza el límite del directorio"? Al cruzar el límite del directorio, me imagino algo así como verificar el archivo desde la raíz hasta getNameCount()-1
. De nuevo, un gran ejemplo que explique la diferencia entre * y ** en la práctica sería genial.
El javadoc para FileSystem#getPathMatcher()
tiene algunos buenos ejemplos y explicaciones
*.java Matches a path that represents a file name ending in .java
*.* Matches file names containing a dot
*.{java,class} Matches file names ending with .java or .class
foo.? Matches file names starting with foo. and a single character extension
/home/*/* Matches /home/gus/data on UNIX platforms
/home/** Matches /home/gus and /home/gus/data on UNIX platforms
C://* Matches C:/foo and C:/bar on the Windows platform (note that the backslash is escaped; as a string literal in the Java Language the pattern would be "C:////*")
Entonces /home/**
coincidiría /home/gus/data
, pero /home/*
no.
/home/*
dice cada archivo directamente en el directorio /home
.
/home/**
está diciendo cada archivo en cualquier directorio dentro /home
.
Ejemplo de *
vs **
. Suponiendo que su directorio de trabajo actual es /Users/username/workspace/myproject
, entonces lo siguiente solo coincidirá con el archivo ./myproject
(directorio).
PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:/Users/username/workspace/*");
Files.walk(Paths.get(".")).forEach((path) -> {
path = path.toAbsolutePath().normalize();
System.out.print("Path: " + path + " ");
if (pathMatcher.matches(path)) {
System.out.print("matched");
}
System.out.println();
});
Si usa **
, coincidirá con todas las carpetas y archivos dentro de ese directorio.