Java 代码行数统计程序

用 Java 完成了一个 DNS Resolver 的作业程序。自我感觉结构写得还不错,便拿着到处和同学比测试速度和测试用例。到最后,实在是比无可比,便想到了比代码行数……

计算代码行数需要去除代码中多余的空白行和注释行。所幸 Cure 有用 Python 写过一个代码行数统计程序,便取过来,配合 Java 语法规则,做了些小修改。便完成了这个 Java 代码行数统计程序

使用该程序需要 Python 运行库支持,使用命令行,
python LineCount.py
在网上还找到一个代码语法高亮着色器,着色一下修改后的代码,贴出来看看效果。
import sys;
import os;

class LineCount:
def trim(self, docstring):
if not docstring:
return ''
lines = docstring.expandtabs().splitlines()

indent = sys.maxint
for line in lines[1:]:
stripped = line.lstrip()
if stripped:
indent = min(indent, len(line) - len(stripped))

trimmed = [lines[0].strip()]
if indent < sys.maxint:
for line in lines[1:]:
trimmed.append(line[indent:].rstrip())

while trimmed and not trimmed[-1]:
trimmed.pop()
while trimmed and not trimmed[0]:
trimmed.pop(0)

return '\n'.join(trimmed)

def FileLineCount(self, filename):
(filepath,tempfilename) = os.path.split(filename);
(shotname,extension) = os.path.splitext(tempfilename);
if extension == '.java':                            # file type 
file = open(filename,'r');
self.sourceFileCount += 1;
allLines = file.readlines();
file.close();

lineCount    = 0;
commentCount = 0;
blankCount   = 0;
codeCount    = 0;
for eachLine in allLines:
if eachLine != " " :
eachLine = eachLine.replace(" ", "");       # remove space
eachLine = self.trim(eachLine);             # remove tabIndent
if (eachLine.startswith("//")       == 1
or eachLine.startswith("*")     == 1
or eachLine.startswith("/*")    == 1
or eachLine.startswith("*/")    == 1):  # LINECOMMENT 
commentCount += 1;
else :
if eachLine == "":
blankCount += 1;
else :
codeCount += 1;
lineCount = lineCount + 1;
self.all        += lineCount;
self.allComment += commentCount;
self.allBlank   += blankCount;
self.allSource  += codeCount;
print filename;
print '           Total      :',lineCount;
print '           Comment    :',commentCount;
print '           Blank      :',blankCount;
print '           Source     :',codeCount;                        

def CalulateCodeCount(self,filename):
if os.path.isdir(filename) :
if not filename.endswith('\\'):
filename += '\\'; 
for file in os.listdir(filename):
if os.path.isdir(filename + file):
self.CalulateCodeCount(filename + file);
else:
self.FileLineCount(filename + file);
else:
self.FileLineCount(filename);

# Open File
def __init__(self):
self.all            = 0;
self.allComment     = 0;
self.allBlank       = 0;
self.allSource      = 0;
self.sourceFileCount= 0;
filename = raw_input('Enter file name: ');
self.CalulateCodeCount(filename);
if self.sourceFileCount == 0 :
print 'No Code File';
pass;
print '\n';
print '*****************  All Files  **********************';
print '    Files      :',self.sourceFileCount;
print '    Total      :',self.all;
print '    Comment    :',self.allComment;
print '    Blank      :',self.allBlank;
print '    Source     :',self.allSource;
print '****************************************************';

myLineCount = LineCount();