2015-03-02 13 views

Odpowiedz

10

DirectoryStream nie jest Stream (jest tam od Java 7, zanim api strumienie został wprowadzony w Javie 8), ale implementuje interfejs Iterable<Path> więc można napisać:

try (DirectoryStream<Path> ds = ...) { 
    Stream<Path> s = StreamSupport.stream(ds.spliterator(), false); 
} 
+5

Zauważ, że 'List' istniały przed strumieniami, a także, a jednak nie dodać' asStream() 'do tego;) – Thirler

+1

Uwaga @ odpowiedzi Holger jest poniżej - można uniknąć konwersji jeśli masz strumień bezpośrednio z' Pliki .newDirectoryStream (Path) '. –

2

DirectoryStream ma metody, która zwraca spliterator. Więc po prostu zrobić:

Stream<Path> stream = StreamSupport.stream(myDirectoryStream.spliterator(), false); 

Może chcesz zobaczyć to pytanie, które jest w zasadzie to, co twój problem sprowadza się do: How to create a Stream from an Iterable.

22

Chociaż możliwe jest przekonwertowanie DirectoryStream na Stream przy użyciu metody spliterator, nie ma powodu, aby to robić. Po prostu stwórz Stream<Path>.

Np. Zamiast dzwonić pod numer Files.newDirectoryStream(Path), wystarczy zadzwonić pod numer Files.list(Path).

Przeciążenie newDirectoryStream która przyjmuje dodatkowy Filter może być zastąpiony przez Files.list(Path).filter(Predicate) i istnieją dodatkowe operacje, takie jak Files.find i Files.walk przekazujących Stream<Path>, jednak ja nie znaleźć zastępstwo dla przypadku, gdy chcesz użyć “glob pattern”. To wydaje się być jedynym przypadkiem, w którym tłumaczenie DirectoryStream na Stream może być przydatne (wolę używać wyrażeń regularnych) ...

0

Oto kolejny przykład pomyślnego uruchomienia na platformie Windows.

import java.nio.file.DirectoryStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

//Using compiler java ver 1.7 
class A { 
    public static void main(String[] args) throws Exception 
    { 
     //Tested on dos directory system 
     Path dir = Paths.get("c:\\a\\b\\"); 

     /** 
     * 
     * This try with exceptions block attempts to open the specified 
     * directory. 
     * 
     */ 
     try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) 
     { 
      // This enhanced for loop block iterates through the specified 
      // directory and outputs each filename 
      for(Path p: stream) 
      { 
       System.out.println(p.getFileName()); 
      } 

     } 
     catch(Exception e) 
     { 
      System.out.println("problems locating directory"); 
     } 
    } 
}