Skip to content
鼓励作者:欢迎打赏犒劳

21-文件工具类

递归文件夹

第一种写法

java
Path startDir = Paths.get("D:\\my-demo");
Files.walk(startDir)
    .filter(path -> Files.isRegularFile(path) || Files.isDirectory(path)) //普通文件或者文件夹
    .forEach(path -> System.out.println("文件/目录: " + path));

第二种传统的写法

java
private static void printAllFiles(File dir) {
    File[] files = dir.listFiles();
    if (files == null) {
        System.out.println("警告:无法访问目录 " + dir.getAbsolutePath());
        return;
    }
    for (File file : files) {
        if (file.isFile()) {
            System.out.println("文件名: " + file.getName());
            System.out.println("完整路径: " + file.getAbsolutePath());
            System.out.println("-------------------------");
        } else if (file.isDirectory()) {
            printAllFiles(file); // 递归处理子目录
        }
    }
}

文件统计

java
Path startDir = Paths.get(".");
try (Stream<Path> stream = Files.walk(startDir)) {
    long fileCount = stream
        .filter(Files::isRegularFile)  // 仅统计普通文件
        .count();
    System.out.println("文件总数: " + fileCount);
}

过滤指定后缀文件

java
Path startDir = Paths.get("D:\\my-demo");
Files.walk(startDir)
    .filter(path -> path.toString().endsWith(".txt"))  // 过滤 .txt 文件
    .forEach(path -> System.out.println("文件/目录: " + path));

实战

打印文件夹下所有信息写入文件

java
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;

public class FileListExporter {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入文件夹路径:");
        String inputPath = scanner.nextLine().trim();

        System.out.print("请输入目录文件保存路径 比如:(C:\\1.txt):");
        String outPath = scanner.nextLine().trim();

        File directory = new File(inputPath);

        // 路径验证
        if (!validatePath(directory)) {
            scanner.close();
            return;
        }

        // 生成输出文件路径
        Path outputPath = Paths.get(outPath);
        
        try (BufferedWriter writer = Files.newBufferedWriter(outputPath)) {
            System.out.println("\n开始遍历文件...");
            long startTime = System.currentTimeMillis();
            
            // 执行遍历并获取文件总数
            int[] counter = {1};  // 使用数组实现传递引用
            Files.walk(directory.toPath())
                 .filter(Files::isRegularFile)
                 .forEach(path -> writeFileInfo(path.toFile(), counter[0]++, writer));
            
            // 输出统计信息
            long duration = System.currentTimeMillis() - startTime;
            String summary = String.format(
                "\n遍历完成!共找到 %d 个文件\n耗时:%d ms\n结果文件:%s",
                counter[0]-1, 
                duration,
                outputPath.toAbsolutePath()
            );
            
            System.out.println(summary);
            writer.write(summary);
            
        } catch (IOException e) {
            System.out.println("发生IO异常: " + e.getMessage());
        } finally {
            scanner.close();
        }
    }

    private static boolean validatePath(File dir) {
        if (!dir.exists()) {
            System.out.println("错误:路径不存在");
            return false;
        }
        if (!dir.isDirectory()) {
            System.out.println("错误:输入的不是文件夹路径");
            return false;
        }
        return true;
    }
    private static void writeFileInfo(File file, int serial, BufferedWriter writer) {
        try {
            String info = String.format(
                "───── 文件 #%d ─────\n" +
                        "├─ 名称:%s\n" +
                        "├─ 路径:%s\n" +
                        "└─ 大小:%s KB\n\n",
                serial,
                file.getName(),
                file.getAbsolutePath(),
                String.format("%,.2f", file.length()/1024.0)
            );
            System.out.println(info);
            writer.write(info);
        } catch (IOException e) {
            System.out.println("无法写入文件信息:" + file.getName());
        }
    }
}

如有转载或 CV 的请标注本站原文地址