qué - tags javadoc
¿Cómo uso el directorio globbing en JDK7? (2)
Este es un ejemplo práctico que muestra todos los archivos zip en cualquier directorio descendiente de d:/
:
public static void main(String[] args) throws IOException {
final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:d:/**/*.zip");
Files.walkFileTree(Paths.get("d:/"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (matcher.matches(file)) {
System.out.println(file);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});
}
Como puede ver, el uso de barras inclinadas hacia delante funciona en Windows.
He estado tratando de usar la nueva función de globbing en JDK7, a partir de la documentación y los ejemplos.
Puedo obtener globos como "glob:*.dat"
para trabajar con el
Files.walkFileTree(startingDir, finder);
ejemplo, pero no he podido hacer funcionar la sintaxis "**"
. Me gustaría poder crear algo como:
matcher = FileSystems.getDefault().getPathMatcher("glob:" + "foo/**/bar/*.dat");
y agradecería un simple ejemplo. Estoy usando Windows 7.
ACTUALIZACIÓN: @Oleg y @JBNizet dejan claro que la sintaxis "/" es independiente del sistema operativo. Tenga en cuenta que los Javadocs sugieren que también es posible la sintaxis dependiente del sistema operativo (? Requerido)
TODAVÍA PROBLEMAS: He tomado @Nizet y editado de la siguiente manera:
@Test
public void testStackoverflowGlobber() throws IOException {
final PathMatcher matcher =
FileSystems.getDefault().getPathMatcher("glob:*.cml");
Files.walkFileTree(Paths.get("d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("try>> "+file);
if (matcher.matches(file)) {
System.out.println("MATCHES>>"+file);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});
}
y esto da salida tal como:
try>> d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources/examples/cdx/r19.cdx
try>> d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources/examples/cdx/r19.cdxml
try>> d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources/examples/cdx/r19.cml
try>> d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources/examples/cdx/r19.ref.cdxml
try>> d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources/examples/cdx/r19.ref.cml
try>> d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources/examples/cif/aa2004.cml
pero no hay evidencia de emparejamiento
Necesitas comenzar tu glob con **
matcher = FileSystems.getDefault().getPathMatcher("glob:**/foo/**/bar/*.dat");
De lo contrario, llamando
matcher.matches(file)
intenta hacer coincidir la ruta completa del archivo con una expresión regular que comienza con la ruta relativa (/ foo /), en lugar de con la ruta absoluta (d: / petermr-workspace /.../ foo).
Si se pasa el ** al globo, solo se le indica que ignore el comienzo de la ruta absoluta.