程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • JavaAPI速查

    • Java基础API
    • String类常用API
    • StringBuilder常用API
    • Arrays数组 工具类
    • Collections 工具类
    • Java 集合常用API
    • Collection 接口集合的遍历方式
    • Map 接口集合的遍历方式
    • Queue 和 Stack 的常用遍历方式
    • 数组的常用遍历方式
    • 字符串的常用遍历方式
    • 文件或目录的常用遍历方式
      • 1. 使用 `File` 类的 `listFiles()` 方法递归遍历目录
      • 2. 使用 `Files.walk()` 方法遍历目录(Java NIO)
      • 3. 使用 `Files.list()` 方法遍历单层目录
      • 4. 使用 `FileVisitor` 接口和 `Files.walkFileTree()` 方法遍历目录
      • 5. 使用递归方法遍历文件和目录(手动实现)
      • 6. 文件或目录的遍历方式总结
    • 比较器的常用使用方式
    • 常用日期和时间API
  • JavaAPI速查
  • JavaAPI速查
scholar
2024-08-24
目录

文件或目录的常用遍历方式

# 文件或目录的常用遍历方式

在 Java 中,遍历文件或目录是常见的操作,特别是在处理文件系统时。

# 1. 使用 File 类的 listFiles() 方法递归遍历目录

使用说明:

  • 适用场景: 适用于遍历文件系统中的所有文件和目录,包括子目录。
  • 注意事项: 递归遍历的方式适合处理深层次的目录结构,但可能会遇到栈溢出问题,尤其是在目录层级过深时。

代码示例:

import java.io.File;

public class RecursiveFileTraversalExample {
    public static void main(String[] args) {
        // 指定需要遍历的根目录
        File rootDirectory = new File("path/to/directory");

        // 调用递归遍历方法,遍历根目录及其所有子目录和文件
        listAllFiles(rootDirectory);
    }

    /**
     * 递归遍历目录下的所有文件和子目录
     * @param directory 当前遍历的目录
     */
    public static void listAllFiles(File directory) {
        // 获取当前目录下的所有文件和子目录
        File[] files = directory.listFiles();

        // 检查是否有文件或子目录(避免空指针异常)
        if (files != null) {
            for (File file : files) {
                // 判断是否为目录
                if (file.isDirectory()) {
                    // 如果是目录,输出目录路径并递归遍历
                    System.out.println("Directory: " + file.getAbsolutePath());
                    listAllFiles(file); // 递归调用遍历子目录
                } else {
                    // 如果是文件,输出文件路径
                    System.out.println("File: " + file.getAbsolutePath());
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

参数说明:

  • File directory:表示需要遍历的文件或目录对象。
  • directory.listFiles():返回当前目录下的所有文件和子目录的数组。

# 2. 使用 Files.walk() 方法遍历目录(Java NIO)

使用说明:

  • 适用场景: 适用于遍历文件系统中的所有文件和目录,支持流式处理,更高效。
  • 注意事项: 仅适用于 Java 8 及以上版本,能够处理大规模的目录结构,且可以方便地结合流操作。

代码示例:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class FilesWalkExample {
    public static void main(String[] args) {
        // 指定需要遍历的根目录
        Path rootPath = Paths.get("path/to/directory");

        // 使用 try-with-resources 自动关闭资源
        try (Stream<Path> paths = Files.walk(rootPath)) {
            // 遍历流中的每个路径(文件或目录)
            paths.forEach(path -> {
                // 判断当前路径是否为目录
                if (Files.isDirectory(path)) {
                    System.out.println("Directory: " + path.toAbsolutePath());
                } else {
                    // 如果是文件
                    System.out.println("File: " + path.toAbsolutePath());
                }
            });
        } catch (IOException e) {
            // 处理IO异常
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

参数说明:

  • Path rootPath:表示需要遍历的根目录路径。
  • Files.walk(rootPath):返回一个包含所有子目录和文件的流(Stream<Path>),支持流式操作。
  • Files.isDirectory(path):判断当前路径是否为目录,返回 true 或 false。

# 3. 使用 Files.list() 方法遍历单层目录

使用说明:

  • 适用场景: 适用于遍历单层目录(不包含子目录),获取目录下的所有文件和子目录。
  • 注意事项: 仅适用于 Java 8 及以上版本,不会递归进入子目录,仅处理当前目录下的内容。

代码示例:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class FilesListExample {
    public static void main(String[] args) {
        // 指定需要遍历的根目录
        Path directoryPath = Paths.get("path/to/directory");

        // 使用 try-with-resources 自动关闭资源
        try (Stream<Path> paths = Files.list(directoryPath)) {
            // 遍历单层目录的每个路径(文件或目录)
            paths.forEach(path -> {
                // 判断当前路径是否为目录
                if (Files.isDirectory(path)) {
                    System.out.println("Directory: " + path.toAbsolutePath());
                } else {
                    // 如果是文件
                    System.out.println("File: " + path.toAbsolutePath());
                }
            });
        } catch (IOException e) {
            // 处理IO异常
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

参数说明:

  • Path directoryPath:表示需要遍历的目录路径。
  • Files.list(directoryPath):返回一个包含当前目录下所有文件和子目录的流(Stream<Path>)。

# 4. 使用 FileVisitor 接口和 Files.walkFileTree() 方法遍历目录

使用说明:

  • 适用场景: 适用于需要更细粒度控制遍历过程的场景,如在遍历过程中执行特定操作(如过滤、删除等)。
  • 注意事项: 适用于 Java 7 及以上版本,提供更灵活的遍历控制,能够处理复杂的遍历需求。

代码示例:

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class FileVisitorExample {
    public static void main(String[] args) {
        // 指定需要遍历的根目录
        Path rootPath = Paths.get("path/to/directory");

        try {
            // 使用walkFileTree方法遍历文件树
            Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {
                /**
                 * 处理文件时的逻辑
                 */
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                    // 输出文件路径
                    System.out.println("File: " + file.toAbsolutePath());
                    return FileVisitResult.CONTINUE; // 继续遍历
                }

                /**
                 * 进入目录前的逻辑
                 */
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
                    // 输出目录路径
                    System.out.println("Directory: " + dir.toAbsolutePath());
                    return FileVisitResult.CONTINUE; // 继续遍历
                }

                /**
                 * 访问文件失败时的逻辑(如权限问题)
                 */
                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) {
                    // 输出错误信息
                    System.err.println("Failed to access: " + file.toAbsolutePath() + " (" + exc.getMessage() + ")");
                    return FileVisitResult.CONTINUE; // 忽略错误继续遍历
                }
            });
        } catch (IOException e) {
            // 处理IO异常
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

参数说明:

  • Path rootPath:表示需要遍历的根目录路径。
  • Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>()):使用文件树遍历,支持自定义的文件处理逻辑。
  • FileVisitResult.CONTINUE:控制遍历的继续或中断,CONTINUE 表示继续遍历。

# 5. 使用递归方法遍历文件和目录(手动实现)

使用说明:

  • 适用场景: 适用于自定义的文件或目录遍历逻辑,常用于简单文件系统操作。
  • 注意事项: 可能会遇到递归过深导致的栈溢出问题,适合小规模的文件系统遍历。

代码示例:

import java.io.File;

public class ManualRecursiveTraversalExample {
    public static void main(String[] args) {
        // 指定需要遍历的根目录
        File rootDirectory = new File("path/to/directory");

        // 调用递归遍历方法,遍历根目录及其所有子目录和文件
        traverseDirectory(rootDirectory);
    }

    /**
     * 递归遍历目录下的所有文件和子目录
     * @param directory 当前遍历的目录
     */
    public static void traverseDirectory(File directory) {
        // 判断是否为目录
        if (directory.isDirectory()) {
            System.out.println("Directory: " + directory.getAbsolutePath());

            // 获取当前目录下的所有文件和子目录
            File[] files = directory.listFiles();

            // 检查是否有文件或子目录(避免空指针异常)
            if (files != null) {
                for (File file : files) {
                    // 递归遍历子目录或输出文件路径
                    traverseDirectory(file);
                }
            }
        } else {
            // 如果是文件,输出文件路径
            System.out.println("File: " + directory.getAbsolutePath());
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

参数说明:

  • File directory:表示需要遍历的文件或目录对象。
  • directory.listFiles():获取当前目录下的所有文件和子目录。

# 6. 文件或目录的遍历方式总结

  • File.listFiles() 和递归方法适合简单的文件和目录遍历,适用于快速实现文件遍历逻辑。
  • Files.walk() 提供了更高效的流式处理,适合需要大规模遍历的场景,结合流操作更灵活。
  • FileVisitor 和 walkFileTree() 适用于需要复杂控制的遍历过程,支持更多的操作和自定义逻辑。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
字符串的常用遍历方式
比较器的常用使用方式

← 字符串的常用遍历方式 比较器的常用使用方式→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式