计算某个文件夹下的文本行数 -- Java简略版本

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

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值