普通递归方式
package org.test;
import java.io.File;
import java.io.FilenameFilter;
public class Test {
private static int fileCount = 0;
public static void main(String[] args) {
test(new File("D:/src"));
//scanDir(new File("D:/src"));
System.out.println("总文件个数:"+fileCount);
}
private static void test(File dir){
if (dir == null || !dir.exists() || !dir.isDirectory()) {
System.out.println("目录不存在!");
return;
}
System.out.println("开始扫描目录: " + dir.getAbsolutePath());
File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File currentDir, String name) {
File file = new File(currentDir, name);
// 如果是目录,递归调用 test()
if (file.isDirectory()) {
test(file);
}
// 如果是文件
if (file.isFile() && name.toLowerCase().endsWith(".java")) {
fileCount++;
System.out.println(file.getAbsolutePath());
return true;
}
return false;
}
});
}
private static void scanDir(File dir) {
if (dir == null || !dir.exists() || !dir.isDirectory()) {
System.out.println("目录不存在!");
return;
}
File[] files = dir.listFiles();
if (files == null) return;
for (File file : files) {
if (file.isDirectory()) {
scanDir(file); // 递归处理子目录
} else if (file.isFile() && file.getName().toLowerCase().endsWith(".java")) {
fileCount++;
System.out.println(file.getAbsolutePath());
}
}
}
}
Lambda方式
package org.test;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class FileCounterStream {
public static long countFilesWithStream(String directory) throws IOException {
return Files.walk(Paths.get(directory))
.filter(Files::isRegularFile) // 只统计普通文件
.count();
}
public static long countFilesByTypeWithStream(String directory, String extension) throws IOException {
return Files.walk(Paths.get(directory))
.filter(Files::isRegularFile)
.filter(path -> path.toString().toLowerCase().endsWith(extension.toLowerCase()))
.count();
}
public static void main(String[] args) {
try {
String currentDir = "D:/src";
// 统计所有文件
long allCount = countFilesWithStream(currentDir);
System.out.println("所有文件数量: " + allCount);
// 统计Java文件
long javaCount = countFilesByTypeWithStream(currentDir, ".java");
System.out.println("Java文件数量: " + javaCount);
} catch (IOException e) {
e.printStackTrace();
}
}
}