最近突然想看看自己所开发的项目的规模是多大,在网上找了半天硬是没找到一个很好的代码行统计工具。于是自己实现了一个简易版的代码行统计工具,先分享如下:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import org.apache.commons.lang.StringUtils;
public class ProjectCountLine
{
private static final String JAVA_FILE_SUF = "java";
private static final String CSS_FILE_SUF = "css";
private static final String JS_FILE_SUF = "js";
private static final String JSP_FILE_SUF = "jsp";
private static final String HTML_FILE_SUF = "html";
private static final String PROPERTIES_FILE_SUF = "properties";
private static final String VM_FILE_SUF = "vm";
// 项目的跟目录
private File rootFile = null;
// 项目的行数
private long count = 0L;
/**
* 入口方法
*
* @param path 项目的根目录路径
* @return
* @throws IOException
* @see [类、类#方法、类#成员]
*/
public long service(String path)
throws IOException
{
boolean flag = checkPath(path);
if (flag)
countFilesLine(rootFile);
return count;
}
/**
* 检查文件是否是需要统计的文件类型
*
* @param fileName 文件的名称
* @return true:文件为需要统计的文件; false:文件为不需要统计的文件
* @see [类、类#方法、类#成员]
*/
private boolean isCountFileType(String fileName)
{
if(StringUtils.isBlank(fileName))
return false;
if (fileName.endsWith(JAVA_FILE_SUF) || fileName.endsWith(CSS_FILE_SUF) || fileName.endsWith(JS_FILE_SUF)
|| fileName.endsWith(JSP_FILE_SUF) || fileName.endsWith(HTML_FILE_SUF) || fileName.endsWith(PROPERTIES_FILE_SUF)
|| fileName.endsWith(VM_FILE_SUF))
return true;
return false;
}
/**
* 检查项目的根路径是否正确
*
* @param path 项目路径
* @return true:传入的路径是正确的; false:传入的路径不正确
* @see [类、类#方法、类#成员]
*/
private boolean checkPath(String path)
{
if (StringUtils.isBlank(path))
return false;
rootFile = new File(path);
if (!rootFile.exists() && !rootFile.isDirectory())
return false;
return true;
}
/**
* 统计指定文件下的所包含的指定格式的文件的行数
*
* @param file 指定文件
* @throws IOException 文件不存在时抛出IO异常
* @see [类、类#方法、类#成员]
*/
private void countFilesLine(File file)
throws IOException
{
File[] files = file.listFiles();
if (null == files)
return;
for (int i = 0; i < files.length; i++)
{
File tempFile = files[i];
String fileName = tempFile.getName();
if (fileName.endsWith("svn"))
continue;
if (tempFile.isFile())
{
if (isCountFileType(fileName))
{
LineNumberReader linReader = new LineNumberReader(new FileReader(tempFile));
linReader.skip(Long.MAX_VALUE);
count += linReader.getLineNumber() + 1;
}
}
else
{
// 当前为File目录,则进行递归
countFilesLine(tempFile);
}
}
}
/* public static void main(String[] args)
{
ProjectCountLine countLine = new ProjectCountLine();
try
{
long count = countLine.service("D:/MWConfigWorkSpace/MWConfig");
System.out.println(count);
}
catch (IOException e)
{
e.printStackTrace();
}
}*/
}