下面这段代码怎么改成使用对象的方式?怎么实现递归分析文件夹下的每个文件(求助,最好能给出代码和注释)

sxyok 发布于 2014/03/20 13:21
阅读 183
收藏 0

解读下一代网络:算力网络正从理想照进现实!>>>

/*读一个文件名称,
如果是.java文件,就分析出 代码行数、空行数、注释行数。
如果是文件夹,就递归分析出该文件夹下的每个java文件的代码行数、空行数、注释行数。
统计注释率、空行率、有效代码率。
把结果使用对象流保存到本地文件,可以随时读取。
 */
package com.eduask.songyang;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.HashSet;
import java.util.Set;

public class CodeInfo {

 public static final Set<String> OUT_FILE;
 static {
  OUT_FILE = new HashSet<String>();
  // 代码备份工具
  OUT_FILE.add("CodeBackup.java");
  // 代码行统计工具
  OUT_FILE.add("CodeCount.java");
 }

 // 代码行
 public int code;

 // 注释行
 public int doc;

 // 空行
 public int empty;

 private CodeInfo() {
 }

 // 递归目录下所有的.java文件
 private void conuntAllFile(File dir) throws Exception {

  File[] childs = dir.listFiles();
  for (int i = 0; i < childs.length; i++) {
   if (OUT_FILE.contains(childs[i].getName())) {
    return;
   }

   if (childs[i].isDirectory()) {
    this.conuntAllFile(childs[i]);
    
   } else if (childs[i].getName().matches(".*\\.java$")) {
    this.countCodeInFile(childs[i]);
    
   }
  }
 }

 // 统计单个文件的代码行,空行,注释行
 private void countCodeInFile(File file) throws Exception {

  BufferedReader br = null;
  boolean isComment = false;
  br = new BufferedReader(new FileReader(file));
  String line = null;

  while ((line = br.readLine()) != null) {

   line = line.trim();

   if (line.matches("^[\\s&&[^\\n]]*$")) {
    this.empty++;
   } else if (line.startsWith("/*") || isComment) {
    // 判断开头字符,以「/*」开头的为注释
    this.doc++;
    // 判断结尾字符,不以「*/」结尾,则下一行是注释
    isComment = !line.endsWith("*/");
   } else if (line.startsWith("//")) {
    // 以「//」开头的为注释
    this.doc++;
   } else {
    // 其余为代码行
    this.code++;
   }
  }

  br.close();

 }

 public static void main(String[] args) throws Exception {

  CodeInfo count = new CodeInfo();
  count.conuntAllFile(new File("src"));

  // 输出结果
  System.out.println("代码行:\t" + count.code);
  System.out.println("注释行:\t" + count.doc);
  System.out.println("空行:\t" + count.empty);

  float code = count.code, doc = count.doc, empty = count.empty;
  float sum = code + doc + empty;

  // 格式化有效代码率,注释率,空行率的值并输出
  NumberFormat num = NumberFormat.getPercentInstance();
  num.setMaximumIntegerDigits(3);
  num.setMaximumFractionDigits(2);
  System.out.println("有效代码率:\t" + num.format(code / sum));
  System.out.println("注释率:\t" + num.format(doc / sum));
  System.out.println("空行率:\t" + num.format(empty / sum));

  try {
   // TODO code application logic here
   String str = "代码行:\t" + count.code + "\r\n" + "注释行:\t" + count.doc
     + "\r\n" + "空行:\t" + count.empty + "\r\n" + "有效代码率:\t"
     + num.format(code / sum) + "\r\n" + "注释率:\t"
     + num.format(doc / sum) + "\r\n" + "空行率:\t"
     + num.format(empty / sum);
   byte[] b = str.getBytes();

   // 输出信息到ini文件
   FileOutputStream fos = new FileOutputStream("F:\\数据信息.ini");
   fos.write(b);
   fos.close();
  } catch (FileNotFoundException ex) {
   System.out.println(ex.getMessage());
  } catch (IOException ex) {
   System.out.println(ex.getMessage());
  }
 }
}

以下是问题补充:

@sxyok:在线求助在线等 (2014/03/20 13:22)
加载中
返回顶部
顶部