可以考虑用队列来解决这个问题,把每一次需要递归的统计的文件夹,当成一个任务,然后把这个任务存进LinkedList中,通过先进先出的方式,来达到递归的目的。
下面我用列队实现了一下
package cn.itcast.h_linecount;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
public class LineCounter2 {
public static void main(String[] args) {
// 初始时向任务队列中添加一个任务
// File dir = new File("E:/Test");
File dir = new File("C:/my_project");
taskQueue.add(dir);
// 执行队表中的所有任务
executeDirFilesLineCountTasks();
// 显示最终结果
System.out.println("总行数:" + count);
}
// 任务队列
private static LinkedList<File> taskQueue = new LinkedList<File>();
// 统计结果
private static int count = 0;
/**
* 执行任务:统计一个文件夹下所有文件的总行数,并且把所有的子文件夹作为新任务添加到任务队列中
*
*/
public static void executeDirFilesLineCountTasks() {
// 循环办理任务队表所有的的任务
while (taskQueue.size() > 0) {
// 1,从任务队列中取出一个任务
File dir = taskQueue.removeFirst();
// 2,办理这个任务
// >> a, 取出这个文件夹中所有子文件与子文件夹
for (File file : dir.listFiles()) {
// >> b, 如果是文件,就统计
if (file.isFile()) {
if (file.getName().endsWith(".java")) {
count += getFileLineCount(file);
}
}
// >> c, 如果是文件夹,就作为一个新任务添加到任务队列中
else {
taskQueue.addLast(file);
}
}
}
}
/**
* 统计指定文件的行数
*
* @param file
* @return
*/
public static int getFileLineCount(File file) {
BufferedReader reader = null;
try {
// 打开文件
reader = new BufferedReader(new FileReader(file));
// 读一行就加1,直到读完全部行
int count = 0;
while (reader.readLine() != null) {
count++;
}
// 返回结果
return count;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
}
希望可以帮到你 |