我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Files.walkFileTree遍历目录文件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Files.walkFileTree遍历目录文件

java.nio.file.Files.walkFileTree是JDK7新增的静态工具方法。

1.Files.walkFileTree的原理介绍

static Path walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor) throws IOException;
static Path walkFileTree(Path start, FileVisitor<? super Path> visitor) throws IOException;

参数列表:

  • java.nio.file.Path start 遍历的起始路径
  • Set<java.nio.file.FileVisitOption> options 遍历选项
  • int maxDepth 遍历深度
  • java.nio.file.FileVisitor<? super Path> visitor 遍历过程中的行为控制器

2.遍历行为控制器FileVisitor

接口java.nio.file.FileVisitor包含四个方法,涉及到遍历过程中的几个重要的步骤节点。

一般实际中使用SimpleFileVisitor简化操作。

public interface FileVisitor<T> {

    FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
        throws IOException;

    FileVisitResult visitFile(T file, BasicFileAttributes attrs)
        throws IOException;

    FileVisitResult visitFileFailed(T file, IOException exc)
        throws IOException;

    FileVisitResult postVisitDirectory(T dir, IOException exc)
        throws IOException;
}
  • preVisitDirectory 访问一个目录,在进入之前调用。
  • postVisitDirectory一个目录的所有节点都被访问后调用。遍历时跳过同级目录或有错误发生,Exception会传递给这个方法
  • visitFile 文件被访问时被调用。该文件的文件属性被传递给这个方法
  • visitFileFailed 当文件不能被访问时,此方法被调用。Exception被传递给这个方法。

3.遍历行为结果 FileVisitResult

public enum FileVisitResult {
    CONTINUE,
    TERMINATE,
    SKIP_SUBTREE,
    SKIP_SIBLINGS;
}
  • CONTINUE 继续遍历
  • SKIP_SIBLINGS 继续遍历,但忽略当前节点的所有兄弟节点直接返回上一层继续遍历
  • SKIP_SUBTREE 继续遍历,但是忽略子目录,但是子文件还是会访问
  • TERMINATE 终止遍历

4.查找指定文件

使用java.nio.file.Path提供的startsWith、endsWith等方法,需要特别注意的是:匹配的是路径节点的完整内容,而不是字符串。

例如: /usr/web/bbf.jar

Path path = Paths.get("/usr/web/bbf.jar");
path.endsWith("bbf.jar");  // true
path.endsWith(".jar");     // false

5.使用PathMatcher

@Test
public void visitFile2() throws IOException {
  // 查找java和txt文件
  String glob = "glob:**
@Test
public void visitFile1() throws IOException {
  String path = "D:\\work_java\\hty\\HTY_CORE";

  Files.walkFileTree(Paths.get(path), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
        throws IOException {
      String pathStr = file.toString();
      if (pathStr.endsWith("properties") || pathStr.endsWith("html")) {
        System.out.println(file);
      }
      return FileVisitResult.CONTINUE;
    }
  });
}


@Test
public void visitFile2() throws IOException {
  String glob = "glob:**
@Test
public void visitFile3() throws IOException {
  // (?i)忽略大小写,(?:)标记该匹配组不应被捕获
  String reg = "regex:.*\\.(?i)(?:properties|html)";
  String path = "D:\\work_java\\hty\\HTY_CORE";

  final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher(reg);

  Files.walkFileTree(Paths.get(path), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
        throws IOException {
      if (pathMatcher.matches(file)) {
        System.out.println(file);
      }
      return FileVisitResult.CONTINUE;
    }
  });
}

6.查找指定文件


@Test
public void visitFile() throws IOException {
  String path = "D:\\work_java\\hty\\HTY_CORE\\class="lazy" data-src";

  Files.walkFileTree(Paths.get(path), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
        throws IOException {
      // 使用endsWith,必须是路径中的一段,而不是几个字符
      if (file.endsWith("log.java")) {
        System.out.println(file);
        // 找到文件,终止操作
        return FileVisitResult.TERMINATE;
      }
      return FileVisitResult.CONTINUE;
    }
  });
}

7.遍历单层目录

使用DirectoryStream会获取指定目录下的目录和文件。可以使用newDirectoryStream的第二个参数进行筛选,glob语法。


@Test
public void dir() throws IOException {
  Path source = Paths.get("D:\\work_java\\hty\\HTY_CORE\\class="lazy" data-src\\main\\resources");
  try (DirectoryStream<Path> stream = Files.newDirectoryStream(source, "*.xml")) {
    Iterator<Path> ite = stream.iterator();
    while (ite.hasNext()) {
      Path pp = ite.next();
      System.out.println(pp.getFileName());
    }
  }
}

8.复制文件到新目录


@Test
public void copyAll() throws IOException {
  Path source = Paths.get("D:\\work_java\\hty\\HTY_CORE\\class="lazy" data-src");
  Path target = Paths.get("D:\\temp\\core");
  // 源文件夹非目录
  if (!Files.isDirectory(source)) {
    throw new IllegalArgumentException("源文件夹错误");
  }
  // 源路径的层级数
  int sourcePart = source.getNameCount();
  Files.walkFileTree(source, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
        throws IOException {
      // 在目标文件夹中创建dir对应的子文件夹
      Path subDir;
      if (dir.compareTo(source) == 0) {
        subDir = target;
      } else {
        // 获取相对原路径的路径名,然后组合到target上
        subDir = target.resolve(dir.subpath(sourcePart, dir.getNameCount()));
      }
      Files.createDirectories(subDir);
      return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
      Files.copy(file, target.resolve(file.subpath(sourcePart, file.getNameCount())),
          StandardCopyOption.REPLACE_EXISTING);
      return FileVisitResult.CONTINUE;
    }
  });
  System.out.println("复制完毕");
}

9.文件和流的复制


@Test
public void copy1() throws IOException {
  Path source = Paths.get("D:\\work_java\\hty\\HTY_CORE\\class="lazy" data-src\\main\\resources\\ehcache.xml");
  Path target = Paths.get("D:\\temp\\");
  if (!Files.exists(target)) {
    Files.createDirectories(target);
  }
  Path targetFile = target.resolve(source.getFileName());
  try (InputStream fs = FileUtils.openInputStream(source.toFile())) {
    Files.copy(fs, targetFile, StandardCopyOption.REPLACE_EXISTING);
  }
}


@Test
public void copy2() throws IOException {
  Path source = Paths.get("D:\\work_java\\hty\\HTY_CORE\\class="lazy" data-src\\main\\resources\\ehcache.xml");
  Path target = Paths.get("D:\\temp\\core");
  Path targetFile = target.resolve(source.getFileName());
  if (!Files.exists(target)) {
    Files.createDirectories(target);
  }
  try (OutputStream fs = FileUtils.openOutputStream(targetFile.toFile());
      OutputStream out = new BufferedOutputStream(fs)) {
    Files.copy(source, out);
  }
}

10.Path与File的转换


@Test
public void testPath() {
	File file = new File("D:\\work_java\\hty\\HTY_CORE");
	System.out.println(file.toURI());//file:/D:/work_java/hty/HTY_CORE
	System.out.println(file.getAbsolutePath());//D:\work_java\hty\HTY_CORE
	System.out.println(file.getName());//HTY_CORE
	
	System.out.println("-------");
	//File转换为Path
	Path path = Paths.get(file.toURI());
	System.out.println(path.toUri());//file:///D:/work_java/hty/HTY_CORE
	System.out.println(path.toAbsolutePath());//D:\work_java\hty\HTY_CORE
	System.out.println(path.getFileName());//HTY_CORE
	
	System.out.println("-------");
	//Path转换为File
	File f = path.toFile();
	System.out.println(f.getAbsolutePath());//D:\work_java\hty\HTY_CORE
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Files.walkFileTree遍历目录文件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Files.walkFileTree遍历目录文件

这篇文章主要介绍了使用Files.walkFileTree遍历目录文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

使用Shell怎么遍历目录及其子目录中的所有文件

本篇文章给大家分享的是有关使用Shell怎么遍历目录及其子目录中的所有文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。新建一个shell文件$ vi traveDir.sh输
2023-06-09

dos下如何遍历目录和文件

小编给大家分享一下dos下如何遍历目录和文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!===== 文件夹结构 ========================
2023-06-08

使用Shell遍历目录及其子目录中的所有文件方法

新建一个shell文件$ vi traveDir.shunXPRPHcZz输入以下代码#! /bin/bashfunction read_dir(){for file in `ls $1` #注意此处这是两个反引号,表示运行系统命令
2022-06-04

Python如何遍历文件夹并输出目录

Python提供了os模块来操作文件和目录。您可以使用os模块中的os.walk()函数来遍历文件夹并输出目录。以下是一个示例代码,演示如何遍历文件夹并输出目录:```pythonimport os# 指定要遍历的文件夹路径folder_p
2023-08-08

Android遍历所有文件夹和子目录搜索文件

本文实例为大家分享了android遍历所有文件夹和子目录来搜索文件,供大家参考,具体内容如下java代码:import java.io.File; import android.app.Activity; import android.os
2022-06-06

Python遍历目录中的所有文件的方法

os.walk生成器 os.walk(PATH), PATH是个文件夹路径,当然可以用.或者../这样啦. 返回的是个三元元组为元素的列表, 每个元素代表了一个文件夹下的内容.第一个就是当前文件夹下内容. 返回的三元元组代表(该工作文件夹,
2022-06-04

Android如何遍历特定目录下所有文件

第一个案例为大家分享了Android遍历特定目录下所有文件,包含子目录的,并删除最新创建的。private boolean deleteLastFromFloder(String path) {boolean success = false
2022-06-06

linux怎么遍历目录下所有的文件夹

在Linux中,可以使用以下命令来遍历目录下所有的文件夹:使用find命令:find /path/to/directory -type d将/path/to/directory替换为要遍历的目录的路径。上述命令将递归地列出指定目录下的所
2023-10-21

python怎么遍历目录所有文件并读取

你可以使用os模块来遍历目录中的所有文件,并使用open函数来读取文件内容。下面是一个示例代码:import osdef traverse_directory(directory):# 遍历目录中的所有文件和子目录for root, di
2023-10-21

shell脚本for循环实现文件和目录遍历

一个for循环实现一个目录下的文件和目录遍历,很实用[root@localhost shell_order]# cat test27.sh #!/bin/bash #print the directory and filefor file
2022-06-04

java实现遍历某个目录(包括子目录)下的所有文件

在java中遍历一个文件夹里边的所有文件,可以有两种方式: 一、递归遍历通常也是开发者第一时间能想到的方法。递归遍历的优点是:实现起来相对简单,代码量相对较少,执行效率较高。缺点是:比较吃内存,对硬件要求较高。在线视频教程分享:java在线视频具体算法如下:/
java实现遍历某个目录(包括子目录)下的所有文件
2017-01-17

怎么用Shell脚本遍历目录并批量修改文件

本篇内容主要讲解“怎么用Shell脚本遍历目录并批量修改文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Shell脚本遍历目录并批量修改文件”吧!在将windows上的jsp网页移植到l
2023-06-09

Python-使用for循环遍历文件

open操作文件r:    以读方式打开,默认就是这个模式w:   以写方式打开a:    以追加模式打开r+:   以读写模式打开w+:  以读写模式打开a+:   以读写模式打开rb:    以二进制读模式打开wb:   以二进制写模式
2023-01-31

Python遍历目录并批量更换文件名和目录名的方法

本文实例讲述了Python遍历目录并批量更换文件名和目录名的方法。分享给大家供大家参考,具体如下:#encoding=utf-8 #author: walker #date: 2014-03-07 #summary: 深度遍历指定目录,并将
2022-06-04

如何使用CMD下一个命令遍历目录并删除相同文件

这篇文章将为大家详细讲解有关如何使用CMD下一个命令遍历目录并删除相同文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如果不小心安装了些制造垃圾的小工具,在系统中各个盘符下都产生了相同的垃圾文件,如我系
2023-06-08

使用php怎么遍历文件夹

使用php怎么遍历文件夹?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主流的数据库
2023-06-14

使用python怎么对磁盘目录进行遍历

这篇文章给大家介绍使用python怎么对磁盘目录进行遍历,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。深度遍历递归import osdef get_files(path): # 判断路径是否存在,如果不存在,函数直接
2023-06-14

Shell脚本遍历目录并批量修改文件编码

在将windows上的jsp网页移植到linux环境中时,发现一个个的转换编码及修改默认编码类型太慢,写此脚本进行尝试文件遍历~ 好久不写,手生了。#!/bin/bash##SPATH="/root/chengji/WebRoot"DPAT
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录