package top.linruchang.bilibili;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class FileLineCount {
private static ArrayList<File> fileList = new ArrayList<File>();
private static ArrayList<File> tempFileList = new ArrayList<File>();
/**
*
* @Description 计算当前目录下的文件行数
* @param targetPath
* @return
*/
public static int sumLineCount(String targetPath, String... types) {
// 1. 获取targetPath 文件对象
File file = new File(targetPath);
// 2. 获取当前目录( file对象 )下的所有符合 type文件类型的 File对象集合
List<File> files = getFiles(file, types);
// 3. 计算符合的文件的行数
int sum = 0;
for (File f : files) {
sum += fileLineCount(f);
}
// 4. 返回当前目录下的所有文件行数
return sum;
}
/**
*
* @Description 得到当前目录下所有符合types类型的文件file
* @param file
* @param types
* @return
*/
public static List<File> getFiles(File file, String... types) {
// 1. 得到当前File下的的所有非目录文件
List<File> AllFiles = queryFiles(file);
// 2. 得筛选出符合types类型的非目录文件
for (File f : AllFiles) {
for (String type : types) {
if (isType(f, type)) {
fileList.add(f);
}
}
}
// 3. 返回符合types的结果
return fileList;
}
private static List<File> queryFiles(File file) {
// 当前File不是目录,则返回null, 是目录则返回数组
File[] files = file.listFiles();
// 文件,则直接增添进入 临时列表
if (files == null) {
tempFileList.add(file);
return tempFileList;
} else if (files.length == 0) {
return tempFileList;
// 非空目录,则迭代调用
} else {
for (File f : files) {
queryFiles(f);
}
}
return tempFileList;
}
/**
*
* @Description 判断file文件的类型 是否是 type类型
* @param file
* @param type
* @return
*/
public static boolean isType(File file, String type) {
String fileName = file.getName();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
if (type.equals(fileType)) {
return true;
}
return false;
}
/**
*
* @Description 计算文本文件的行数
* @param file
* @return
*/
public static int fileLineCount(File file) {
// 1. 得出当前文件类型,用于switch匹配筛选规则
String fileName = file.getName();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
// 2. 定义返回变量
int lineCount = 0;
BufferedReader br = null;
try {
switch (fileType) {
case "java": {
// 空行,含有 package、import、@Override、*、// 不计入lineCount中
FileReader fr = new FileReader(file);
br = new BufferedReader(fr);
String line;
while(true) {
line = br.readLine();
if(line == null) {
break;
}
if((line.length() == 1 && "\n".equals(line)) || (line.length() == 1 && "\r".equals(line))) {
continue;
}
if((line.length() == 2 && "\r\n".equals(line))) {
continue;
}
if(line.contains("package") || line.contains("import") || line.contains("@Override") || line.contains("//")) {
continue;
}
if(line.contains("*")) {
continue;
}
++lineCount;
}
break;
}
// 未写筛选规则,日后在先
case "html": {
FileReader fr = new FileReader(file);
br = new BufferedReader(fr);
String line;
while(true) {
line = br.readLine();
if(line == null) {
break;
}
++lineCount;
}
break;
}
// 其他类型,默认计入文件的全部行,包括空行等等
default: {
FileReader fr = new FileReader(file);
br = new BufferedReader(fr);
String line;
while(true) {
line = br.readLine();
if(line == null) {
break;
}
++lineCount;
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return lineCount;
}
/**
*
* @Description 清空 临时列表tempFileList跟fileList的数据 -- 注意程序运行前先执行这个函数
* @param args
*/
public static void clear() {
tempFileList.clear();
fileList.clear();
}
public static void main(String[] args) {
// 1. 清空 临时列表tempFileList跟fileList的数据
FileLineCount.clear();
// 2. 定义需要计算行数的文件类型
String[] types = {"java"};
// 3. 计算符合2步骤文件类型的行总数 ---- 填入你自己的文件夹
int lineCount = sumLineCount("E:\\eclipse\\workspace\\学习\\src\\top\\linruchang\\dao", types);
// 3. 打印结果
System.out.println(lineCount);
}
}
计算某个文件夹下的文本行数 -- Java简略版本
于 2019-11-27 02:33:18 首次发布