tutorialspoint qué los generan formato docs all java java-7 glob java.nio.file

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.