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