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. JSP 使用<%@include%>报Duplicate local variable path 错误 解决方法

    错误提示:Multiple annotations found at this line:- Duplicate local variable path- Duplicate local variab ...

  2. bzoj 4319: Suffix reconstruction 后缀数组+构造

    题目大意 给定后缀数组sa,要求构造出满足sa数组的字符串.或输出无解\(n\leq 5*10^5\) 题解 我们按照字典序来考虑每个后缀 对于\(Suffix(sa[i])\)和\(Suffix(s ...

  3. 洛谷 2577 [ZJOI2005]午餐——序列dp

    题目:https://www.luogu.org/problemnew/show/P2577 可以从只有一个窗口的角度思考出一个贪心结论.就是应当按吃饭时间(不算打饭时间)从大到小排序.这样交换相邻两 ...

  4. The current .NET SDK does not support targeting .NET Core 2.2

    The current .NET SDK does not support targeting .NET Core 2.2 1. 奇怪的错误 最近遇到了一件奇怪的事, The current .NET ...

  5. Python实例浅谈之五Python守护进程和脚本单例运行

    一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc ...

  6. GET请求中的乱码原理解析和解决方案

    2. 乱码问题解决 基础知识 1)浏览器会在中文的UTF-8后加上上%得到URL编码   例如: %e8%b4%b9%e7%94%a8%e6%8a%a5%e9%94%80 2)以get的请求发送到to ...

  7. JavaScript高级程序设计学习笔记第二章

    1.向 HTML 页面中插入 JavaScript 的主要方法,就是使用<script>元素 2.HTML 4.01中定义了<script>元素的六个属性(方便记忆,可将6个属 ...

  8. WPF学习系列之四(WPF事件5大类)

    WPF最重要的5类事件: 生命周期事件:这些事件将在元素被初始化,加载或卸载时发生. 鼠标事件 这些事件是鼠标动作的结果. 键盘事件 这些事件是键盘动作的结果. 手写笔事件 这些事件是作用类似铅笔的手 ...

  9. hadoop学习笔记之-hbase完全分布模…

    安装环境: OS: Oracle linux 5.6 JDK: jdk1.6.0_18 Hadoop: hadoop-0.20.2 Hbase: hbase-0.90.5 安装准备: 1. Jdk环境 ...

  10. Struts2返回JSON数据的具体应用范…

    Struts2返回JSON数据的具体应用范例 博客分类: Struts2 Struts2JSON  早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具 ...