如何从DirectoryStream创建流

在阅读DirectoryStream的API时,我错过了很多function。 首先,它建议使用for循环从流到List 。 我错过了DirectoryStream不是Stream的事实。

如何从Java 8中的DirectoryStream创建Stream

DirectoryStream不是Stream (它在Java 7之后就已存在,在Java 8中引入了流api之前),但它实现了Iterable接口,因此您可以编写:

 try (DirectoryStream ds = ...) { Stream s = StreamSupport.stream(ds.spliterator(), false); } 

虽然可以使用其spliterator方法将DirectoryStream转换为Stream ,但没有理由这样做。 首先创建一个Stream

例如,不要调用Files.newDirectoryStream(Path)只调用Files.list(Path)

接受额外FilternewDirectoryStream的重载可能被Files.list(Path).filter(Predicate)替换,还有其他操作,如Files.findFiles.walk返回Stream ,但是,我没有找到替换你想要使用“glob模式”的情况 。 这似乎是唯一一种将DirectoryStream转换为Stream可能有用的情况(我更喜欢使用正则表达式)…

DirectoryStream有一个返回spliterator的方法。 所以这样做:

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

您可能希望看到这个问题,这基本上是您的问题减少到的: 如何从Iterable创建Stream 。

这是另一个在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 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"); } } }