Comment faire un Stream à partir D'un DirectoryStream

lors de la lecture de l'API pour DirectoryStream je manque beaucoup de fonctions. Tout d'abord, il suggère d'utiliser une boucle for pour aller de flux List. Et je regrette le fait que c'est un DirectoryStream n'est pas Stream.

Comment puis-je faire un Stream<Path> dans un DirectoryStream en Java 8?

17
demandé sur Stuart Marks 2015-03-02 12:33:02

4 réponses

DirectoryStream n'est pas Stream (il existe depuis Java 7, avant L'introduction de l'api streams dans Java 8) mais il implémente le Iterable<Path> interface de sorte que vous pourriez écrire:

try (DirectoryStream<Path> ds = ...) {
  Stream<Path> s = StreamSupport.stream(ds.spliterator(), false);
}
11
répondu assylias 2015-03-02 09:37:31

Alors qu'il est possible de convertir un DirectoryStream dans un Stream à l'aide de son spliterator méthode, il n'y a aucune raison de le faire. Il suffit de créer un Stream<Path> en premier lieu.

par exemple, au lieu d'appeler Files.newDirectoryStream(Path) appel Files.list(Path).

La surcharge de newDirectoryStream qui accepte supplémentaires Filter peut être remplacé par Files.list(Path).filter(Predicate) et il y a d'autres opérations comme l' Files.find et Files.walk retour Stream<Path> cependant, je n'ai pas trouver un remplacement pour le cas où vous souhaitez utiliser le "glob motif". Cela semble être le seul cas où traduire un DirectoryStream dans un Stream peut être utile (je préfère utiliser des expressions régulières de toute façon)...

24
répondu Holger 2015-03-02 11:10:00

DirectoryStream a une méthode qui renvoie un spliterator. Donc suffit de faire:

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

vous pourriez vouloir voir cette question, qui est essentiellement ce que votre problème réduit à: comment créer un flux à partir d'un.

2
répondu Alexis C. 2017-05-23 12:26:00

voici un autre exemple exécuté avec succès sur la plate-forme 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");
        }
    }
 } 
0
répondu Mark Burleigh 2017-03-16 10:31:17