如何从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)
。
接受额外Filter
的newDirectoryStream
的重载可能被Files.list(Path).filter(Predicate)
替换,还有其他操作,如Files.find
和Files.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"); } } }
- “线程中的exception”主“java.lang.IndexOutOfBoundsException:Index:0,Size:0”with ArrayList?
- 在Java中删除退出目录
- 如何使用Ajax调用jsf操作方法(在JSF 1.2中)?
- 年轻一代的垃圾收集问题
- 在Microsoft sql server中连接/附加不同的表
- maven-site plugins 3.3 java.lang.ClassNotFoundException:org.apache.maven.doxia.siterenderer.DocumentContent
- Spring 3安全性j_spring_security_check
- Antlr无关输入
- 二叉树的最低共同祖先