急!急!急!急!急! 在一个文件夹目录下 如果是.java文件就分析出有效代码行数、空行数、注释行数。接下面

如果是文件夹,就递归分析出该文件夹下的每个java文件的有效代码行数、空行数、注释行数(//单行注释和/**/多行注释和/***/文档注释)。然后,比如说在workspa... 如果是文件夹,就递归分析出该文件夹下的每个java文件的有效代码行数、空行数、注释行数(//单行注释和/**/多行注释和/***/文档注释)。
然后,比如说在workspace目录下统计到3个java文件,分别把每个java文件的注释率、空行率、有效代码率的结果算出来,再把他们3个java文件(当成一体来看)的总注释率、总空行率、总有效代码率算出来
最后把----注意是这4个结果,使用对象流保存到本地文件,可以随时读取?
请把代码发送到二零五零八八三九五四的抠抠youxiang谢谢!
展开
 我来答
月光雪松
2014-03-19 · TA获得超过476个赞
知道小有建树答主
回答量:338
采纳率:100%
帮助的人:234万
展开全部

我们以前在学校的时候也做过这个,还要用Swing做界面。不过今天是我从新做出来的

JavaSourceUtil.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class JavaSourceUtil {
public static void main(String[] args) {
// 统计文件路径
String folderPath = "C:\\Users\\xmi\\Desktop\\AnzDoc\\123\\BatchAssistant\\src\\dcb\\";
// 路径文件
File folder = new File(folderPath);
// 源文件统计工具
JavaSourceUtil util = new JavaSourceUtil();
// 根据路径得到统计结果列表
List<SourceBean> cntList = util.countJavaSource(folder);
// 根据统计行数计算注释率、空行率、有效代码率的结果
StringBuffer resultSbuf = util.outputCountResult(cntList);
// 输出统计结果
System.out.println(resultSbuf.toString());
// 保存结果到文件
util.saveFile(resultSbuf, "D:\\java_source_cnt.txt");
}

public StringBuffer outputCountResult(List<SourceBean> listBean){
StringBuffer sbuf = new StringBuffer();
SourceBean totalCntBean = new SourceBean("全部文件统计");
for(SourceBean bean : listBean) {
int tolCnt = bean.getTotalLine();
if (tolCnt == 0) {
continue;
}
// 注释率、空行率、有效代码率的结果算出来
sbuf.append(bean.fileName + "代码统计:").append("\r\n");
sbuf.append("空行率:").append(bean.blankLine * 1.0 / tolCnt)
.append("\r\n");
sbuf.append("注释率:")
.append((bean.singlgCmtLine + bean.multCmtLine) * 1.0
/ tolCnt).append("\r\n");
sbuf.append("有效代码率:").append(bean.codeLine * 1.0 / tolCnt)
.append("\r\n\r\n");

totalCntBean.blankLine += bean.blankLine;
totalCntBean.codeLine += bean.codeLine;
totalCntBean.documtLine += bean.documtLine;
totalCntBean.multCmtLine += bean.multCmtLine;
totalCntBean.singlgCmtLine += bean.singlgCmtLine;
}

sbuf.append(totalCntBean.fileName + "代码统计:").append("\r\n");
sbuf.append("总空行率:").append(totalCntBean.blankLine * 1.0 / totalCntBean.getTotalLine())
.append("\r\n");
sbuf.append("总注释率:")
.append((totalCntBean.singlgCmtLine + totalCntBean.multCmtLine) * 1.0
/ totalCntBean.getTotalLine()).append("\r\n");
sbuf.append("总有效代码率:").append(totalCntBean.codeLine * 1.0 / totalCntBean.getTotalLine())
.append("\r\n\r\n");
return sbuf;
}


/**
 * Java代码统计
 * @param folder 基本路径
 * @return 统计结果
 */
public List<SourceBean> countJavaSource(File folder){
List<SourceBean> cntList = new ArrayList<SourceBean>();
if (!folder.exists() || !folder.isDirectory()) {
return cntList;
}
File[] files = folder.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
cntList.addAll(countJavaSource(folder));
} else {
SourceBean cntBean = countCodeLine(files[i]);
if (cntBean != null) {
cntList.add(cntBean);
}
}
}
return cntList;
}

/**
 * 单个文件代码统计
 * @param javaFile .java文件
 * @return 统计结果
 */
public SourceBean countCodeLine(File javaFile){
if(!javaFile.exists() || !javaFile.isFile() || !javaFile.getName().endsWith(".java")){
return null;
}
SourceBean cntBean = new SourceBean(javaFile.getAbsolutePath());
// 代码状态
int status = 0;
try {
InputStreamReader isr = new InputStreamReader(new FileInputStream(javaFile)); 
String str = "";
BufferedReader bufReader = new BufferedReader(isr);

while((str = bufReader.readLine()) != null){
str = str.trim();
if (str.startsWith("/**")) {
// 文档注释
status = 10;
} else if (str.startsWith("/*")) {
// 多行注释
status = 20;
}

if (isEmpty(str)) {
// 空白航
cntBean.blankLine ++;
} else if (status == 10) {
// 文档注释
cntBean.documtLine ++;
} else if (status == 20) {
// 多行注释
cntBean.multCmtLine ++;
} else if (str.startsWith("//")) {
// 单行注释
cntBean.singlgCmtLine ++;
} else {
// 代码行
cntBean.codeLine ++;
}

if (str.endsWith("*/")) {
// 单行或文本注释结束
status = 0;
}
}
bufReader.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cntBean;
}

/**
 * 空行判断
 * @param strValue
 * @return 是否为空行
 */
public boolean isEmpty(String strValue){
if (strValue == null || strValue.trim().equals("")) {
return true;
}
return false;
}

/**
 * 读取文本文件
 * @param path
 * @return
 */
public void saveFile(StringBuffer builder, String path){
try {
FileOutputStream fos = new FileOutputStream(path);
fos.write(builder.toString().getBytes("utf-8"));
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

SourceBean.java

public class SourceBean {
// 空白行
public int blankLine;
// 单行注释
public int singlgCmtLine;
// 多行注释
public int multCmtLine;
// 代码行数
public int codeLine;
// 文挡注释
public int documtLine;
// 文件名
public String fileName;

public SourceBean(String fileName){
this.fileName = fileName;
}

public int getTotalLine(){
int totalLine = blankLine + singlgCmtLine + multCmtLine + codeLine
+ documtLine;
return totalLine;
}
}

是不是很简单!

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式