列出目录中的文件

用File类的list()方法可以很容易的列出目录中的所有文件的文件名。如果想要获取文件而不止是文件名的话,可以使用它的listFiles()方法。这很简单,难的是怎么去处理这个返回的列表。我们不再使用传统的冗长的外部迭代器,而是使用优雅的函数式来实遍历这个列表。这里我们还得用到JDK的新的CloseableStream接口以及一些相关的高阶函数。

下面这段代码可以列出当前目录下所有文件的名字。

Files.list(Paths.get("."))

.forEach(System.out::println);

如果想列出别的目录的话,可以把”.”替换成想要访问的目录的完整路径。

这里先是使用了Paths的get()方法,通过一个字符串创建了一个Path实例。然后通过Files工具类的list()方法获取到了一个ClosableStream对象,我们可以用它来遍历目录下的所有文件。然后我们使用内部迭代器forEach()来打印出文件名。我们先来看下这段代码的部分输出结果:列出当前目录下的文件及子目录。

./aSampleFiles.txt

./bin

./fpij

...

如果我们只想获取当前目录的子目录,而不要文件的话,可以使用filter()方法:

Files.list(Paths.get("."))

.filter(Files::isDirectory)

.forEach(System.out::println);

ilter()方法将目录从文件流中筛选出来。我们把Files类的isDirectory方法的引用传了进去,而不是传递一个lambda表达式。回想下filter()方法它需要的是一个返回boolean值的Predicate类型,这个方法正好合适。最后我们用一个内部迭代器来打印出目录的名字。程序将会打印出当前目录的子目录。

./bin

./fpij

./output

...

这样写简单多了,跟Java老的写法相比省了不少代码。下面我们来看下如何列出匹配某个模式的文件。

列出目录下指定的文件

Java很早前就提供了一个list()方法的变种,用来筛选文件名。这个版本的list()方法接受一个FilenameFilter类型的参数。这个接口只有一个accept()方法,它接受两个参数:File dir(代表目录),以及String name(代表文件名)。accept()方法返回true的话这个文件名就会出现在返回的列表中,返回false则不在。我们来实现一下这个方法。

习惯性的做法是将一个实现了FilenameFilter接口的匿名内部类的实例传给list()方法。比如说,我们来看下如何用这种方式来返回fpij目录下的.java文件。

final String[] files =

new File("fpij").list(new java.io.FilenameFilter() {

public boolean accept(final File dir, final String name) {

return name.endsWith(".java");

}

});

System.out.println(files);

这着实得费些工夫写几行代码。这样的代码太聒噪了:创建对象,调用函数,定义匿名内部类,在类里面嵌入方法等等。我们不用再忍受这样的痛苦了,只需传一个接受两个参数并返回bollean的lambda表达式进去就好了。Java编译器会搞定剩下的事。

前面那个例子可以简单的用一个lambda表达式替换掉匿名内部就好了,但是还有进一步优化的空间。新的DirectoryStream工具可以帮助我们更高效的遍历大的目录结构。我们来试下这种方法。这是newDirectoryStream()方法的一个变种,它接受一个额外的过滤器。

Files.newDirectoryStream(

Paths.get("fpij"), path -> path.toString().endsWith(".java"))

.forEach(System.out::println);

这样我们去掉了匿名内部类并把繁琐的代码变得简洁明了。这两个版本的输出结果是一样的。我们来打印下指定的文件。

这段代码只会输出指定目录下的.java文件,下面是它的部分输出结果:

fpij/Compare.java

fpij/IterateString.java

fpij/ListDirs.java

...

我们基于文件名来筛选文件,同样也可以很容易通过文件属性,比如文件是不是可执行文件,是否可读,可写等来进行筛选。这么做的话得需要一个listFiles()方法,它接受一个FileFilter类型的参数。我们仍然使用lambda表达式来实现而不是去创建匿名内部类。现在来看一个列出当前目录下所有隐藏文件的例子。

final File[] files = new File(".").listFiles(file -> file.isHidden());

如果我们操作的是一个很大的目录,可以使用DirectoryStream而不是直接调用File上面的方法。

我们传给listFiles()方法的lambda表达式的签名和FileFilter接口的accept()方法的签名是一样的。这个lambda表达式接受的是一个File实例的参数,在这个例子中参数名是file。如果文件是隐藏属性的话,刚返回true,否则返回false.

这里其实还可以再精简下代码,我们不传lambda表达式了,传一个方法引用会让代码看起来会更简洁一些 :

new File(".").listFiles(File::isHidden);

我们先用lambda表达式实现,随后又使用方法引用将它重构得更加简洁。如果我们再写新的代码的话,当然应该采用这种简洁的方式。如果可以早点发现这种简洁的实现,我们当然要优先使用它。有一句话叫做”先让它能工作,然后再去优化(make it work, then make it better)",先让代码能跑起来,等我们理清楚了,才去考虑简洁性和性能等进行优化。

我们通过一个例子来从目录中过滤出了指定的文件。下面我们来看下如何去遍历指定目录下的子目录。

java 遍历文件夹 性能_Java函数式编程(十一):遍历目录相关推荐

  1. linux遍历文件夹下所有文件大小,Linux系统遍历文件夹 获取文件大小的操作(C语言实现)...

    /** linux 下遍历文件夹以及获取文件大小 */ #include #include #include #include /** 获取文件大小,但是文件大小不能超过2G ,该方法不推荐使用 */ ...

  2. java创建文件夹代码_Java创建文件夹及文件实例代码

    package com.xhkj.util; import java.io.File; import java.io.IOException; public class CreateFileUtil ...

  3. java实现文件夹复制_Java实现文件夹复制

    packageconstxiong.interview;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;imp ...

  4. python如何遍历文件夹中的所有图片_python实现遍历文件夹图片并重命名

    在做深度学习相关项目时,需要标注图片,筛选过后图片名字带有括号,显得比较乱,因此利用python进行统一规范重命名操作 实现方法是利用python的os模块对文件夹进行遍历(listdir),然后使用 ...

  5. python循环遍历所有目录_python 遍历文件夹

    一.os.walk() os.walk(top, topdown=True, οnerrοr=None, followlinks=False) 可以得到一个三元tupple(dirpath, dirn ...

  6. java多线程 文件夹_Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合

    复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...

  7. java 文件 递归_JAVA实现遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  8. java遍历子目录_Java遍历文件夹及子目录代码实例

    主要逻辑 使用scanner类获取输入的目录,并创建文件对象. 新建一个遍历文件夹的方法,参数是已创建的文件对象,递归调用自己. import java.io.File; public class B ...

  9. java遍历文件夹下的_Java遍历文件夹下的所以文件

    利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作.如:对文件进行重命名,对某一类文件进行重编码.可以对某一工程下的全部.java文件进行转码成utf-8等 代码如下,这里只对文件进行重 ...

  10. java遍历文件_Java 遍历文件夹的几种方式

    最近面试的时候被问及,使用非递归的方式遍历文件夹下的所有文件.由于之前没有写过,当时卡了一下,最后也没给出好的方案. 从计算机的角度看,文件夹的数据结构就是多叉树(Tree),而树的遍历方式有两种:深 ...

最新文章

  1. 数据挖掘过程中:数据预处理
  2. Python 生成器(yield)
  3. 记一次Hbase数据迁移和遇到的问题
  4. Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features)
  5. Hive2.1.1执行initSchema报错
  6. 【渝粤教育】国家开放大学2018年春季 8665-21T护理伦理学 参考试题
  7. BXP无盘WINXP优化精华篇(转)
  8. 大数据项目开发进度(实时更新)
  9. java前缀表达式二叉树课程设计_表达式构建二叉树(中缀,前缀,后缀)
  10. 关于onselect与onchange的介绍
  11. 形容词和指示代词-this、that、thses、those_31
  12. 华光职业学院计算机专业,关于给予张庆俊等同学省高校计算机一级 考试成绩优秀奖励的通知...
  13. 电脑开热点手机无法连接,显示无ip分配的问题
  14. 知识图谱实体预测任务如何计算filtered MRR
  15. 软件自我成长之路——关于自动更新
  16. Tita:2021年的绩效考核(上)
  17. 根据PPG估算血压利用频谱谱-时间深度神经网络【翻】
  18. 从OA到COP,致远互联成引领行业的“灯塔”
  19. 非正常情况下的移动加权平均算法
  20. 12个 “经典” 网站!

热门文章

  1. mysql 5.7.26 linux安装_mysql-5.7.28 在Linux下的安装教程图解
  2. WPF 美化界面,样式的使用
  3. SqlServer日期时间格式转换
  4. goflyway安装
  5. hinkPad T510系列主要机型对比
  6. npm升级所有可更新包
  7. iOS开发系列-ARC浅解
  8. Tomcat(一):基础配置详解
  9. 浅谈Nodejs应用主文件index.js组成部分——略详解
  10. Console-算法[for]-素数