Java 8特性尝鲜:新新IO

在这个专题前面的文章中,我们已经看到,使用Java8的lambda表达式对现有的JDK1.2 I/O库的提升,主要是可以使用lambda表达式来构造java.io.FileFilter的实例。

很多读者都指出了,java.io中的很多API已经被Java7中的java.nio的API所取代了,这里N的意思是New。然而Java8还给我们带来了更多的惊喜,我们把它叫做新新IO(New New IO),虽然jOOQ社区的成员都建议把它叫做企业级IO(Enterprise IO)。

言归正传,我们对Java8的新IO特性已经有了一个初步的了解。我们先来看一下java.nio.Files里面的增加的新的方法。最给力的一点是我们终于可以方便的列出路径下的文件了,Java8里面我们只需要用一下这个新加的方法Files.list(),这个返回的是一个惰性的文件流:

Files.list(new File(".").toPath())
.forEach(System.out::println);

这个的输出结果是:

.\.gitignore
.\.idea
.\java8-goodies.iml
.\LICENSE.txt
.\pom.xml
.\README.txt
.\src
.\target

需要注意的是forEach方法是一个“最终方法”,也就是最终消费这个流的。别人就不能再使用这个流了。

如果我们想过滤掉所有的隐藏文件并只显示前三个普通文件的话,可以这么写:

Files.list(new File(".").toPath())
.filter(p -> !p.getFileName()
.toString().startsWith("."))
.limit(3)
.forEach(System.out::println);

新的输出会是这样:

.\java8-goodies.iml
.\LICENSE.txt
.\pom.xml

现在看起来已经很棒了。还能再给力点么?当然。你可以使用新的Files.walk()方法遍历整个目录。下面是代码示例:

Files.walk(new File(".").toPath())
.filter(p -> !p.getFileName()
.toString().startsWith("."))
.forEach(System.out::println);

问题来了,上面的代码会创建一个路径流,过滤掉了所有的隐藏文件和目录,但是它们的子文件还是会被列出来。因此会得到这样的结果:

过滤的:
.\.git 不过却列出了:
.git\COMMIT_EDITMSG
.\.git\config
.\.git\description
[...]

不难理解,Files.walk()返回了所有子文件的流,filter方法会将所有隐藏文件删除掉,不过现在walk的实现里对递归下去的文件不起任何作用。这确实让人有点失望。我们也没法借助Java7里面的walkFileTree方法,因为它接受的参数FileVisitor类型不是一个@FunctionalInterface。

不过,通过点小的改进可以勉强解决下这个问题:

Files.walk(new File(".").toPath())
.filter(p -> !p.toString()
.contains(File.separator + "."))
.forEach(System.out::println);

现在可以得到我们想要的结果了:

.
.\java8-goodies.iml
.\LICENSE.txt
.\pom.xml
.\README.txt
.\src
.\src\main
.\src\main\java
.\src\main\java\org
.\src\main\java\org\jooq
[...]

同样给我们带来惊喜的是Files.lines方法。下面的代码展示了如何使用它方便的换行读取文件,并逐行trim同时过滤空白行:

Files.lines(new File("pom.xml").toPath())
.map(s -> s.trim())
.filter(s -> !s.isEmpty())
.forEach(System.out::println);

输出的结果:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jooq</groupId>
<artifactId>java8-goodies</artifactId>
<version>1.0-SNAPSHOT</version>
[...]

总结

惰性求值这个概念会让很多人摸不着头脑,同样的还有流只能消费一次这个情况。我敢打赌Java 8的IO流相关API的问题会是Stack Overflow的新宠。

尽管如此,不得不说Stream API的确是非常酷。在下期的文章里面,我们将会介绍如何使用lambda表达式和流来进行排序,再后面要亮相的将是Java8给DB操作带来的提升。

原文地址:http://it.deepinmind.com/java/2014/02/13/Java8-features-new-new-io.html

Java 8特性尝鲜:新新IO的更多相关文章

  1. 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜

    自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15. 恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 ...

  2. Android4.1(Jelly Bean)API新特性尝鲜

    原文:http://android.eoe.cn/topic/android_sdk Android 4.1 APIs (API Level: 16)http://developer.android. ...

  3. Java 15 正式发布, 14 个新特性,刷新你的认知!!

    JDK 15 2020/09/15 如期而至! 这个时间牛逼啊,和苹果发布会同天? OracleJDK 15 发布地址: https://www.oracle.com/java/technologie ...

  4. Leetcode多线程题库练习(新功能尝鲜)& 个人感悟

    大家好, 我是方子龙.很久没有自己写文章了. 一面是因为工作上的需求开发任务比较重,下班回家基本上就躺床玩几把王者,度过闲暇时光. 二面是一有点时间就自己主动地去看书和学习,知道自己还缺少很多知识,由 ...

  5. 小程序新能力-个人开发者尝鲜微信小程序

    个人开发者的福利 微信小程序,刚听到这个新名词的时候,我就兴冲冲的去找入口,看看自己能不能搞个微信小程序的HelloWorld,毕竟能在微信上把自己写的一些小工具跑起来还是满炫酷的. 没想,网上一查, ...

  6. Java语言:JAVA8 十大新特性详解(zz)

    关键词: Lambda表达式.函数式接口.方法与构造函数引用.接口的默认方法 原文地址: http://www.jb51.net/article/48304.htm 本教程将Java8的新特新逐一列出 ...

  7. Java 9中的 9个 新特性

    Java 9 中的 9个 新特性 java 7 2011发布,Java 8 2014发布,java9发布于2017年9月21日. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它 ...

  8. 夯实Java基础系列21:Java8新特性终极指南

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  9. Java协程编程之Loom项目尝鲜

    前提 之前很长一段时间关注JDK协程库的开发进度,但是前一段时间比较忙很少去查看OpenJDK官网的内容.Java协程项目Loom(因为项目还在开发阶段,OpenJDK给出的官网https://ope ...

随机推荐

  1. NO2:设置RedHat Linux下的samba开机启动

    安装的samba默认不是开机启动的,这样每次都要进入系统人为启动,很不方便,当然系统肯定可以设置开机启动的. 因为我的是RedHat Linux系统,支持chkconfig命令直接配置,会简单些,其它 ...

  2. NCEE2018游记

    前言 悠闲的高中生活结束啦.俺たちの戦いはこれからだ!(无误) Day0 看考场 听考前教育,前面还挺常规,后面讲了半个多小时相关法律,听了几句后实在没兴趣了,开始瞎想.那个人连续读了近一个小时也不嫌 ...

  3. Codeforces Round #394 (Div. 2) 颓废记

    昨天晚上(今天凌晨),又忍不住去打CF.(本蒟弱到只能打Div.2)... 我觉得我可以用一个词概括我这次的CF: 呵呵 刚一开赛,我就codeforces访问失败.. 后来好不容易能上了,两三分钟才 ...

  4. JSOI2008星球大战——联通块数量

    题目:https://www.luogu.org/problemnew/show/1197 此题不能按时间顺序进行删点.求连通块数量,而应打破时间的思维,先形成一张没有要删去的点的图,再从后往前逐个加 ...

  5. c# Linq Where 抛出异常 导致 程序崩溃

    Collection was modified; enumeration operation may not execute" 这次项目中遇到一个问题, 就是C#程序随机崩溃, 抛出上面的异 ...

  6. [RTOS]--uCOS、FreeRTOS、RTThread、RTX等RTOS的对比之特点

    本篇博客就来细数这几个RTOS的特点.   以下内容均来自官方网站或者官方手册Feature的Google翻译的加了我的一些调整,没有任何主观成分. 1. FreeRTOS   FreeRTOS是专为 ...

  7. ubuntu_deb安装命令

    dpkg命令常用格式如下: sudo dpkg -I iptux.deb#查看iptux.deb软件包的详细信息,包括软件名称.版本以及大小等(其中-I等价于--info) sudo dpkg -c ...

  8. foreach中collection的三种用法

    转载:http://blog.sina.com.cn/s/blog_b0d90e8c0102v1q1.html 传参参考:http://www.cnblogs.com/ruiati/p/6410339 ...

  9. mvc 自定义 AuthorizeAttribute 验证逻辑

    public class AuthorizationFilterAttribute : AuthorizeAttribute { Dictionary<string, string> ro ...

  10. [xdoj1227]Godv的数列(crt+lucas)

    解题关键:1001=7*11*13,模数非常小,直接暴力lucas.递归次数几乎为很小的常数.最后用中国剩余定理组合一下即可. 模数很小时,一定记住lucas定理的作用 http://acm.xidi ...