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?
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);
}
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)...
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.
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");
}
}
}