在 NIO.2 中使用Stream APi
NIO.2中的新Stream方法
java.nio.file.Files 添加了返回 Stream(注意是Stream流) 接口实现的操作
static Stream<Path> find(Path start,
int maxDepth,
BiPredicate<Path,
BasicFileAttributes> matcher,
FileVisitOption... options)
static Stream<Path> list(Path dir)
static Stream<String> lines(Path path)
static Stream<String> lines(Path path, Charset cs)
static Stream<Path> walk(Path start,
FileVisitOption... options)
static Stream<Path> walk(Path start,
int maxDepth,
FileVisitOption... options)
返回的Stream是 LAZY 的,这意味着在使用这些元素之前不会加载(或读取)它们。这是一个很好的性能增强。
Files.list()
遍历一个目录以返回一个Stream,该Stream的元素是表示该目录条目的 Path 对象
static Stream<Path> list(Path dir)
throws IOException
- 如果参数不表示目录,则引发异常
- 此方法是线程安全的,但是一致性较弱,这意味着在迭代一个目录时,对该目录的更新可能会反映在返回的流中,也可能不会反映在返回的流中
Files.walk()
遍历一个目录以返回一个流,该流的元素是表示该目录条目的 Path 对象(递归地遍历子目录)
static Stream<Path> walk(Path start,
FileVisitOption... options)
throws IOException
static Stream<Path> walk(Path start,
int maxDepth,
FileVisitOption... options)
throws IOException
- 它采用了深度优先的策略,即在探索另一个目录之前,将目录结构从根目录遍历到子目录的所有方式。
- 与 Files.list ()一样,建议使用带有 try-with-resources 的 Files.walk () ,如果参数不表示目录,则抛出异常,并将其视为弱一致的方法。
Files.find()
类似于 file.walk () ,但接受一个类型为 BiPredicate 的附加参数,该参数用于筛选文件和目录
static Stream<Path> find(Path start,
int maxDepth,
BiPredicate<Path,BasicFileAttributes> matcher,
FileVisitOption... options)
throws IOException
Files.lines ()
将文件的所有行作为字符串流读取
static Stream<String> lines(Path path, Charset cs)
throws IOException
static Stream<String> lines(Path path)
throws IOException
Stream lines()
惰性的,其元素是从 BufferedReader 中读取的行
总结
- 在Java8中,返回流接口实现的新方法被添加到Java.nio.file.Files中。
- 返回的流是惰性的,这意味着元素在被使用之前不会被加载(或读取)。
- 建议对这些方法使用try with resources,以便可以调用流的close方法来关闭文件系统资源。
- list()遍历一个目录以返回一个流,该流的元素是表示该目录项的路径对象。此方法列出指定目录的目录和文件。但是,它不是递归的,换句话说,它不遍历子目录。
- walk()还以深度优先策略对目录进行迭代,以返回一个流,该流的元素是表示该目录项的路径对象。与Files.list()的区别在于Files.walk()会递归遍历子目录。还可以传递最大遍历深度和跟随符号链接的选项。
- Files.find()与Files.walk()类似,但它采用了另一个BiPredicate<Path,BasicFileAttributes>类型的参数,用于过滤文件和目录。
- Files.lines()以字符串流的形式读取文件中的所有行,而不将它们全部加载到内存中。
Comments | 0 条评论