当前位置:  编程技术>java/j2ee

Java函数式编程(十一):遍历目录

    来源: 互联网  发布时间:2014-11-08

    本文导语:  列出目录中的文件 用File类的list()方法可以很容易的列出目录中的所有文件的文件名。如果想要获取文件而不止是文件名的话,可以使用它的listFiles()方法。这很简单,难的是怎么去处理这个返回的列表。我们不再使用传统的冗...

列出目录中的文件

用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 map(HashMap TreeMap)用法:初始化,遍历和排序详解
  • 请问怎么用Java实现一个URL的遍历??急!!!!
  • Java递归 遍历目录的小例子
  • java集合map取key使用示例 java遍历map
  • java遍历properties文件操作指南
  • 在java的GUI的应用程序中能否实现对容器(如Frame)中的所有组件遍历?
  • Java集合Set、List、Map的遍历方法
  • JAVA遍历一个文件夹中的所有文件的小例子
  • 请问用JAVA如何遍历一个目录下的所有文件?
  • java使用iterator遍历指定目录示例分享
  • java map遍历的四种方法总结
  • JAVA遍历map的几种实现方法代码
  • java数组遍历 删除remove(示例代码)
  • java如何遍历一个目录,读出其中所有的文件名
  • java遍历读取整个redis数据库实例
  • java中关于Map的三种遍历方法详解
  • Java遍历Properties所有元素的方法实例
  • 基于Java实现的图的广度优先遍历算法
  • java的数学函数在那个类中,如幂函数、指数、对数、双曲线函数等?
  • 怎样用JAVA函数读写注册表,有这样的函数吗
  • java 的条件判断函数(类似于别的语言iif函数)
  • PHP中的Pack()函数,Java有哪个函数与之对应???
  • JAVA中函数调用时,能不能向 C/C++一样函数的入口参数可以为传出值(就是引用,或指针)
  • 急!请问有分析java程序性能瓶颈的工具吗?例如,统计 java 程序中函数调用次数?
  • 请问在JAVA里将小写字母换为大写字母是用什么函数,大写转成小写又是用哪个函数?
  • java里有什么函数可以检查 java 代码并执行它?
  • 谁能告诉我,在JAVA中,哪个函数和ASP中的Int()函数等同,也就是取整函数
  • java类中的方法就是函数了,函数参数全是传值了,传址参数怎样表示?
  • 虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析
  • Java中有不有与VB中Replace函数功能类似的函数?
  • java中函数的缺省参数怎么定义?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • 用java做网络编程和用c做网络编程有啥区别
  • 我想买台二手笔记本作编程,请问java编程的最低配置是多少,价几何
  • 哪位java同门师兄有《java2编程详解》电子文档,注意不是影印版
  • 寻找<<java2图形设计卷2SWING>>一书源代码和<<java网络高级编程>>一书源代码
  • 电力翻译的o'reilly的Java网络编程(Java network programming)怎样?
  • Java 网络编程有些什么内容?
  • 《java编程指南 》这本书好吗?
  • ubuntu上配置Java编程环境
  • 针对使用java进行硬件编程
  • Linux下java编程
  • 基于Java的新编程语言 Jabaco
  • 怎样学习JAVA网络编程?
  • java的网络编程
  • [菜鸟提问]关于linux下的java编程
  • Java行为驱动编程框架 JDave
  • 有没有关于Java和编程的50个观点?
  • 编程语言 Java
  • 推荐一本电子版的xml与java编程的书,告诉我下载地址。
  • Java Mail 编程
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3