
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());
}
}
}