2017-04-12 5 views
1

Der folgende Code zeigt Dateien an.Java-Stream-Filter zeigt keine Ausgabe

Files.walk(Paths.get("E:\\pdf")) 
       .map(path -> path.toAbsolutePath().getFileName()) 
         .forEach(System.out::println); 

Aber das zeigt keine PDF-Ausgabe, warum es nicht funktioniert?

Files.walk(Paths.get("E:\\pdf")) 
       .map(path -> path.toAbsolutePath().getFileName()) 
        .filter(path -> path.endsWith(".pdf")) 
         .forEach(System.out::println); 

Antwort

4

Als this question Punkte und this article erklärt, path.endsWith() nur true zurück, wenn es eine vollständige Übereinstimmung für alles ist nach dem letzten Verzeichnisseparator:

Wenn Sie das java.io.file.Path Objekt verglichen werden müssen, beachten Sie Das Path.endsWith(String)wird NUR ein anderes Unterelement des Path-Objekts in Ihrem ursprünglichen Pfad, nicht der Pfadname Zeichenfolge Teil! Wenn Sie den Teil des Zeichenfolgennamens zuordnen möchten, müssen Sie zuerst die Path.toString() aufrufen.

Eine schnelle Lösung ist, die Filter mit ersetzen:

path.toString().toLowerCase().endsWith(".pdf"); 

Es gibt auch Java NIO des PathMatcher, die für den Umgang mit Pfaden gemacht wird. Hier ein Beispiel:

final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.pdf"); 

Sie mit verwenden können:

.filter(path -> matcher.matches(path)) 

Siehe Finding Files Tutorial für weitere Details.

Verwandte Themen