在 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

image.png

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()以字符串流的形式读取文件中的所有行,而不将它们全部加载到内存中。

这个家伙很懒,啥也没有留下😋