2016-07-27 34 views
5

Próbuję napisać aplikację, aby użyć w niej metody Files.find.Jak używać metody Java 8 `Files.find`?

Poniżej programu działa perfekcyjnie:

package ehsan; 

/* I have removed imports for code brevity */ 

public class Main { 
    public static void main(String[] args) throws IOException { 
     Path p = Paths.get("/home/ehsan"); 
     final int maxDepth = 10; 
     Stream<Path> matches = Files.find(p,maxDepth,(path, basicFileAttributes) -> String.valueOf(path).endsWith(".txt")); 
     matches.map(path -> path.getFileName()).forEach(System.out::println); 
    } 
} 

To działa prawidłowo i daje mi listę plików kończących się .txt (pliki tekstowe aka):

hello.txt 
... 

ale poniżej programu nie pokazuje niczego:

package ehsan; 

public class Main { 
    public static void main(String[] args) throws IOException { 
     Path p = Paths.get("/home/ehsan"); 
     final int maxDepth = 10; 
     Stream<Path> matches = Files.find(p,maxDepth,(path, basicFileAttributes) -> path.getFileName().equals("workspace")); 
     matches.map(path -> path.getFileName()).forEach(System.out::println); 
    } 
} 

Ale nic nie pokazuje :(

Tu jest mój dom folderu hierarchi (ls wynik):

blog   Projects 
Desktop  Public 
Documents  Templates 
Downloads  The.Purge.Election.Year.2016.HC.1080p.HDrip.ShAaNiG.mkv 
IdeaProjects   The.Purge.Election.Year.2016.HC.1080p.HDrip.ShAaNiG.mkv.aria2 
Music   Videos 
Pictures  workspace 

Więc co się dzieje złego path.getFileName().equals("workspace")?

+0

Czy próbowałeś użyć debuggera? – Jens

+4

Pamiętaj, że musisz zamknąć 'Stream', który zwraca' Files.find (...) ', w przeciwnym razie masz wyciek zasobów; [Dokumenty API] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#find-java.nio.file.Path-int-java.util. function.BiPredicate-java.nio.file.FileVisitOption ...-) wyjaśnij to (zobacz, gdzie jest napisane "należy użyć konstrukcji try-for-resources ..."). – Jesper

+0

IntelliJ ma bardzo dobry debugger (nie wiem, co masz na myśli z "debuggerem VS"). Możesz także po prostu umieścić instrukcje "System.out.println (...)" w punktach kodu, aby zobaczyć, co się dzieje. – Jesper

Odpowiedz

3

Path.getFilename() nie zwraca ciąg, ale obiekt ścieżka, zrobić getfilename(). ToString(). Equals ("roboczy")

+3

Dzięki, czy to nie jest zabawne, że getFileName() faktycznie nie zwraca nazwy pliku! ? –

1

Użyj następujących i spojrzeć na konsoli. Może żaden z twoich plików nie zawiera workspace w tym

+1

Jak pokazano w moim katalogu domowym hiearchy, ja ** POSIADAM ** folder 'workspace' :) –

+0

Dzięki, był bardzo użyteczny i przyjazny dla użytkownika :) –

+0

@ehsan Witaj, nie wiem, czy to sarkazm, ale ja nie było wcale nieprzyjazne, nie martw się :) Mam nadzieję, że pomogło –