c 遍历文件 递归遍历_将递归文件系统遍历转换为流

c 遍历文件 递归遍历

在学习编程的时候,回溯到Turbo Pascal的时代,我设法使用FindFirstFindNextFindClose函数在目录中列出文件。 首先,我想出了一个打印给定目录内容的过程。 您可以想象我为能够真正从自身调用该过程以递归遍历文件系统而感到自豪。 好吧,那时我还不知道递归一词,但是它确实有用。 Java中的类似代码如下所示:

public void printFilesRecursively(final File folder) {for (final File entry : listFilesIn(folder)) {if (entry.isDirectory()) {printFilesRecursively(entry);} else {System.out.println(entry.getAbsolutePath());}}
}private File[] listFilesIn(File folder) {final File[] files = folder.listFiles();return files != null ? files : new File[]{};
}

不知道File.listFiles()可以返回null ,是吗? 这就是它发出I / O错误的信号,就像IOException不存在一样。 但这不是重点。 System.out.println()很少是我们所需要的,因此该方法既不可重用也不可组合。 这可能是“ 打开/关闭”原理的最佳反例。 我可以想象文件系统递归遍历的几个用例:

  1. 获取所有文件的完整列表以供显示
  2. 查找与给定模式/属性匹配的所有文件(还要检出File.list(FilenameFilter)
  3. 搜索一个特定文件
  4. 处理每个文件,例如通过网络发送

上面的每个用例都有一系列独特的挑战。 例如,我们不想建立所有文件的列表,因为在开始处理它之前将花费大量的时间和内存。 我们希望通过流水线计算(但没有笨拙的访问者模式)来处理文件的发现和延迟。 另外,我们也希望使搜索短路以避免不必要的I / O。 幸运的是,在Java 8中,其中一些问题可以通过流解决:

final File home = new File(FileUtils.getUserDirectoryPath());
final Stream<Path> files = Files.list(home.toPath());
files.forEach(System.out::println);

请记住, Files.list(Path) (Java 8中的新增功能)没有研究子目录,我们将在以后进行修复。 这里最重要的一课是: Files.list()返回Stream<Path> –我们可以传递,组合,映射,过滤等的值。它非常灵活,例如,计算我拥有的文件数非常简单在每个扩展名的目录中:

import org.apache.commons.io.FilenameUtils;//...final File home = new File(FileUtils.getUserDirectoryPath());
final Stream<Path> files = Files.list(home.toPath());
final Map<String, List<Path>> byExtension = files.filter(path -> !path.toFile().isDirectory()).collect(groupingBy(path -> getExt(path)));byExtension.forEach((extension, matchingFiles) ->System.out.println(extension + "\t" + matchingFiles.size()));//...private String getExt(Path path) {return FilenameUtils.getExtension(path.toString()).toLowerCase();
}

好吧,您可能会说,只是另一个API。 但是一旦我们需要更深入 ,递归地遍历子目录,它就会变得非常有趣。 流的一项惊人功能是,您可以通过各种方式将它们相互组合。 老Scala说“ flatMap that shit”也适用于此,请查看以下递归Java 8代码:

//WARNING: doesn't compile, yet:private static Stream<Path> filesInDir(Path dir) {return Files.list(dir).flatMap(path ->path.toFile().isDirectory() ?filesInDir(path) :singletonList(path).stream());
}

filesInDir()延迟生成的Stream<Path>包含目录中的所有文件,包括子目录。 您可以通过调用map()filter()anyMatch()findFirst()等将其用作任何其他流。但是它实际上如何工作? flatMap()map()类似,但是map()是直接的1:1转换, flatMap()允许用多个条目替换输入Stream中的单个条目。 如果使用map() ,则最终会得到Stream<Stream<Path>> (或者可能是Stream<List<Path>> )。 但是flatMap()以爆炸内部条目的方式展平了该结构。 让我们看一个简单的例子。 想象一下Files.list()返回了两个文件和一个目录。 对于文件, flatMap()随该文件接收一个元素的流。 我们不能简单地返回该文件,而必须对其进行包装,但实际上这是无操作的。 对于目录,它变得更加有趣。 在这种情况下,我们递归地调用filesInDir() 。 结果,我们获得了该目录的内容流,并将其注入到外部流中。

上面的代码简短,甜美,并且…无法编译。 这些令人讨厌的异常再次检查。 这是一个固定的代码,包装检查过的异常以保持理智:

public static Stream<Path> filesInDir(Path dir) {return listFiles(dir).flatMap(path ->path.toFile().isDirectory() ?filesInDir(path) :singletonList(path).stream());
}private static Stream<Path> listFiles(Path dir) {try {return Files.list(dir);} catch (IOException e) {throw Throwables.propagate(e);}
}

不幸的是,这种相当优雅的代码还不够懒。 flatMap()急切求值,因此即使我们几乎不要求第一个文件,它始终会遍历所有子目录。 您可以尝试使用我的小型LazySeq库,该库试图提供甚至更lazy-seq抽象,类似于Scala中的流或Clojure中的lazy-seq 。 但是,即使是标准的JDK 8解决方案也可能确实有用,并且可以大大简化您的代码。

翻译自: https://www.javacodegeeks.com/2014/07/turning-recursive-file-system-traversal-into-stream.html

c 遍历文件 递归遍历

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

净迁移人口预测程序python_高质量深度学习模型, 一键模型预测,迁移学习很简单...

飞桨(PaddlePaddle)核心框架Paddle Fluid v1.5已经发布&#xff0c;而作为其关键工具&#xff0c;用来迁移学习的PaddleHub也进行了全面更新&#xff0c;正式发布了1.0版本。全新的PaddleHub模型和任务更加丰富&#xff0c;为用户提供了覆盖 文本 、 图像 和 视频 三大领域八大…

您的JVM是否泄漏文件描述符-像我的一样?

前言&#xff1a;此处描述的两个问题是在一年前发现并修复的。 本文仅用作历史证明&#xff0c;也是有关解决Java中文件描述符泄漏的初学者指南。 在Ultra ESB中&#xff0c;我们使用内存RAM磁盘文件缓存来进行快速且无垃圾的有效负载处理。 一段时间以前&#xff0c;我们在共…

matlab中degrees,Convert degrees-minutes-seconds to degrees

Angle in degrees-minutes-seconds representation, specified as ann-by-3 real-valued matrix. Each row specifies oneangle, with the format [D M S]:D contains the “degrees” elementand must be integer-valued.M contains the “minutes” elementand must be integ…

螺旋桨设计软件_欧洲斥巨资研发的A400M螺旋桨运输机,为啥就没人买啊?| 图说...

A400M是欧洲自行设计、研制和生产的新一代军用运输机&#xff0c;也是欧盟国家进行合作的最大的武器联合研制项目。A400M最大的特点&#xff0c;就是其标志性的8叶弯刀螺旋桨。A400M也是20世纪后服役的为数不多的几个使用涡轮旋桨发动机的军用运输机之一。A400M曾在系列电影《碟…

python5个功能_5个常用的定制Python功能代码

文章来源&#xff1a;淘论文网 发布者&#xff1a;毕业设计浏览量:一、随机数生成>>> import random #导入Python内置的随机模块>>> num random.randint(1,1000) #生成1-1000之间的伪随机数二、读文件>>> f open(c:\1.txt,r)>>> lin…

php链接远程socket,php使用socket获取远程图片

步骤&#xff1a;1&#xff0c;匹配URL中的主机名和文件部分2&#xff0c;创建socket并连接到目标服务器3&#xff0c;构造HTTP请求并发送4&#xff0c;读取HTTP响应并解析5&#xff0c;保存内容到文件并关闭socket连接代码实现如下&#xff1a;/** 使用socket获取远程资源(网页…

JAR文件句柄:烦恼后清理!

在Ultra ESB中&#xff0c;我们使用特殊的热交换类加载器 &#xff0c;该加载器使我们可以按需重新加载Java类。 这使我们能够从字面上热交换我们的部署单元 -加载&#xff0c;卸载&#xff0c;使用更新的类重新加载&#xff0c;以及正常地逐步退出-无需重启JVM。 Windows&…

大气校正后的ndvi_Sentinel2 L1C下载、大气校正、重采样

点击蓝字关注我哦1.基本信息(成像仪/重访周期/波段数/分辨率)哨兵2号是高分辨率多光谱成像卫星&#xff0c;携带一枚多光谱成像仪(MSI)&#xff0c;用于陆地监测&#xff0c;可提供植被、土壤和水覆盖、内陆水路及海岸区域等图像&#xff0c;分为2A和2B两颗卫星,哨兵&#xff0…

hello python的代码,python基础教程之Hello World!

Python命令行假设你已经安装好了Python, 那么在Linux命令行输入:代码如下:$python将直接进入python。然后在命令行提示符>>>后面输入:代码如下:>>>print(Hello World!)可以看到&#xff0c;随后在屏幕上输出:代码如下:Hello World!print是一个常用函数&#…

python3 线程隔离_Python的线程隔离实现方法

前段时间看了下flask的源码&#xff0c;对于这样一个轻量级的web框架是怎样支持多线程的感到非常好奇&#xff0c;于是深入了解了一番。flask是依赖werkeug来实现线程间的隔离的&#xff0c;而werkeug最后又使用到了python的内置模块locals来承载数据&#xff0c;看不如写&…

限定通配符和非限定通配符_为什么我不信任通配符以及为什么我们仍然需要通配符...

限定通配符和非限定通配符在将子类型多态性&#xff08;面向对象&#xff09;与参数多态性&#xff08;泛型&#xff09;相结合的任何编程语言中&#xff0c;都会出现方差问题。 假设我有一个字符串列表&#xff0c;键入List<String> 。 我可以将其传递给接受List<Obj…

php strtotime month bug,处理PHP strtotime的BUG

PHP strtotime的BUG处理最近使用了strtotime结合-1 month, 1 month, next month获取上个月或者下个月的日期&#xff0c;不过刚看到一篇文章&#xff0c;才知道原来使用strtotime直接获取日期还是有点小BUGBUG如日期&#xff1a;$today 2020-12-31;echo date("Y-m-d"…

JMetro版本11.5.11和8.5.11发布

你好 具有新JMetro样式的另一个版本&#xff08;深色和浅色版本&#xff09;&#xff1a; 分割菜单按钮 分割窗格 药丸按钮/分段按钮 调整现有样式和错误修复。 继续阅读以获取详细信息。 分割菜单按钮 以下是一个动画&#xff0c;显示了新的“拆分菜单按钮” JMetro浅色…

python远程连接mysql数据库_MySQL数据库之python mysql远程连接

本文主要向大家介绍了MySQL数据库之python mysql远程连接 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。第一步&#xff1a;vim /etc/MySQL/my.cnf找到bind-address 127.0.0.1注释掉这行&#xff0c;如&#xff1a;#bind-address 12…

php100并发cpu告警,多线程并发导致CPU100%的一种原因和解决办法

在用自定义线程池的时候&#xff0c;遇到cpu100%&#xff0c;经过验证后&#xff0c;发现问题来源于我定义的子线程。子线程的主要功能是从任务队列(LinkedBlockingQueue)里面持续拿出任务&#xff0c;并且执行。以下为令CPU100的代码。private class WorkThread extends Threa…

excel离散度图表怎么算_一般人不知道的几个excel制图技巧

原标题&#xff1a;一般人不知道的几个excel制图技巧作者&#xff1a;杜雨 公众号&#xff1a;数据小魔方(datamofang)今天这篇&#xff0c;我专注于Excel的作图规则&#xff0c;深入的研究下Excel由数据源到可视化图表之间的关系是如何对应的&#xff0c;倘若你已经在工作中横…

listview控件在php的使用方法,Android_Android编程之控件ListView使用方法,本文实例讲述了Android编程之控 - phpStudy...

Android编程之控件ListView使用方法本文实例讲述了Android编程之控件ListView使用方法。分享给大家供大家参考。具体分析如下&#xff1a;控件ListView是一个重要的控件&#xff0c;可以被用作用户列表等显示&#xff0c;下面进行它的操作测试。下面代码实现了生成了一个ListVi…

使用ElasticSearch进行近实时索引

选择索引策略很困难。 Elasticsearch 文档的确有一些一般性建议 &#xff0c;并且有其他公司的 一些技巧 &#xff0c;但这也取决于特定的用例。 在典型情况下&#xff0c;您有一个数据库作为事实的来源&#xff0c;并且有一个使事物可搜索的索引。 您可以采用以下策略&#xf…

air什么意思中文_Air 的中文意思是什么?

展开全部air释义&#xff1a;(1)作为名词&#xff0c;空气&#xff1b;32313133353236313431303231363533e59b9ee7ad9431333431366261天空&#xff1b;(飞行的)空中。(2)作为动词&#xff0c;晾&#xff1b;晾干&#xff1b;(使)通风&#xff1b;公开发表。读音&#xff1a;英[…

python xlutils函数,python3:xlrd、xlwt、xlutils处理excel文件

1.xlrd读取excel请参考上篇博客https://www.cnblogs.com/shapeL/p/9075843.html2.xlwt生成excel安装下载&#xff1a;pip install xlwt导入&#xff1a;import xlwt参考&#xff1a;生成excel文件test1.xlsfile_name ../dataconfig/test1.xlswbk xlwt.Workbook() #初始化work…