个人项目:WC(Java 实现)
2021-06-28 14:05
标签:估计 view 用户需求 文本文件 举例 amp 表达式 sign pre 一、Github地址:https://github.com/Seamiddle/WC/tree/master/WordCount 二、WC项目要求: wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。 实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。 基本功能列表: wc.exe -c
file.c //返回文件
file.c 的字符数(完成) wc.exe -w
file.c //返回文件
file.c 的词的数目 (完成) wc.exe -l
file.c //返回文件
file.c 的行数(完成)
扩展功能: 空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。 代码行:本行包括多于一个字符的代码。 注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释: } //注释 [file_name]: 文件或目录名,可以处理一般通配符。
高级功能:(完成) -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。 需求举例: 三、解题思路: 1、统计行数、字符数和字数的问题:可以对所选文件的所有字符历遍一遍,如果不是转义字符例如换行,换页等,那么字符数加一;行数等于换行符的数目加一, 因为文本结尾没有换行符;单词之间有符号进行间隔,所以一个非符号的字符前面是一个字母,那么单词数加一; 2、 递归处理目录下符合条件的文件:首先获取文件所在的目录,遍历处理目录中符合要求的文件(自定义为后缀.java的文件); 3、图形化界面:首先要获取用户选择的文件,然后将处理结果显示在文本框窗口上。 因此需要学习java的IO、图形界面的API文档。 四、设计实现过程 1、首先将要统计的文件封装成一个类,本人定义为FileCount类,属性包括文件(filename)、行数(lines)、字符数(symbols)和词数(words)。同时定义count方法 统计文件; 2、主方法通过传入的参数来创建不同的类和调用不同的方法; 3、创建一个继承JFrame的窗口类来显示用户所选文件的统计信息; 五、代码说明 1、统计(行、字数、词): 以上为FileCount类的count()方法,其中lines(int),symbols(int),words(int),filename(File)为FileCount类的属性,代表行数、字符数、词数和文件名 2、-s参数统计目录下符合要求的文件: 以上为主方法的一部分,其中arguement为传入的参数,FileCount是上文提及的类,count()是它统计信息的方法 3、-x图形界面: 1)主方法中创建文件选择框: 2)传入所选文件的参数file,先将文件的内容打印在文本框中,然后用文件名创建FileCount类对象进行统计: 注:第二部分是FileFrame类构造方法的一部分,其中filename为第一部分选中的文件 五、测试运行: 注:文件所在目录为D:\ 1、空文件: 2、一个符号: 3、一个词: 4、一行: 5、正常: -s处理: 运行结果: 6、图形界面: 选择文件: 运行结果: 六、PSP表格: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 · Estimate · 估计这个任务需要多少时间 Development 开发 · Analysis · 需求分析 (包括学习新技术) · Design Spec · 生成设计文档 · Design Review · 设计复审 (和同事审核设计文档) · Coding Standard · 代码规范 (为目前的开发制定合适的规范) · Design · 具体设计 · Coding · 具体编码 · Code Review · 代码复审 · Test · 测试(自我测试,修改代码,提交修改) Reporting 报告 · Test Report · 测试报告 · Size Measurement · 计算工作量 · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 合计 七、项目小结: 本次项目让我感到困难的是: 1、判断文件是否合法 ;2、判断是否为一个单词;3、判断代码行和注释行;4、工具的使用,比如github和exe4j 解决的方法:(1)对于1,我创建文件对象时同时创建文件输入流,利用Java异常捕捉判断文件是否存在; (2)对于2和3,事后我才知道应该要用正则匹配来匹配文本每一行的内容,以后要学习正则表达式; (3)github和git的使用我通过网上进行学习,而exe4j是将java的jar包生成exe的工具,我暂时没有学会,要继续学习; 总的来说,这次项目让我发现了自己的知识面很窄,很多工具没用过,以后要从多渠道学习,并且勤写代码。 个人项目:WC(Java 实现) 标签:估计 view 用户需求 文本文件 举例 amp 表达式 sign pre 原文地址:https://www.cnblogs.com/Seamiddle/p/9649025.html
具体功能要求:
程序处理用户需求的模式为:wc.exe [parameter]
[file_name]
-s 递归处理目录下符合条件的文件。(完成)
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。
在这种情况下,这一行属于注释行。
wc.exe -s -a *.c
返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。 public void count(){ //计算文件中行数、字符数和单词数
FileReader fr = null;
try {
fr = new FileReader(this.filename);
int firstread,nowread;
char c_firstread,c_nowread; //标记文件中的当前字符和前一个字符
if((firstread = fr.read())!=-1){ //判断文件是否为空
c_firstread = (char)firstread;
this.lines++;
if(!(c_firstread==‘\n‘)) this.symbols++;
for(nowread = fr.read();;nowread = fr.read()){ //依次读文件中的每个字符
if(nowread==-1){//判断是否只有一个字符
if((c_firstread>=‘A‘&&c_firstread
(c_firstread>=‘a‘&&c_firstread))
words++;
break;
}
c_firstread = (char)firstread;
c_nowread = (char)nowread;
//System.out.print(c_nowread);
if(nowread==‘\n‘) this.lines++;//当前所读的是换行符,行数加一
if(!((c_nowread>=‘A‘&&c_nowread=‘a‘&&c_nowread)))
if((c_firstread>=‘A‘&&c_firstread=‘a‘&&c_firstread))
words++;//如果当前所读的是非字母,前一个所读为字母,单词数加一
if(!(c_nowread==‘\n‘)) this.symbols++;
firstread = nowread;
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else if(arguement.equals("-s"))//第一个参数为"s",显示该目录下符合的文件的统计信息
{
File parent = Filename.getParentFile();//获取文件所在的目录
File[] otherfiles = parent.listFiles();//获取目录中的文件
//如果后缀为.java的文件进行统计
for(File f:otherfiles){
if(f.toString().endsWith(".java")){
FileCount fc = new FileCount(f);
fc.count();
System.out.println("\nFile "+f+"\nsymbols are "+fc.getSymbols()+
"\nlines are "+fc.getLines()+"\nwords are "+fc.getWords());
}
}
}
//如果参数为"x",创建图形界面类,显示所选文件的统计信息
if(arguement.equals("-x")){
JFileChooser jfc = new JFileChooser();//创建文件发送选择框
jfc.setMultiSelectionEnabled(false);
jfc.showOpenDialog(new JLabel());
File file = jfc.getSelectedFile();//获取选中的文件
if(file!=null) {
if(file.toString().endsWith(".java"))
new CountFrame(file);
else System.out.println("ERRORFile");
}
else System.out.println("ERRORFile");
}JTextArea textarea = new JTextArea(filename.toString());//文本框
JScrollPane scroller = new JScrollPane(textarea);
FileReader fr = null;
BufferedReader bfr = null;
char[] buff = new char[128];
try {
fr = new FileReader(filename);
bfr = new BufferedReader(fr);
while(bfr.read(buff)!=-1)//读取文本,并显示在文本框中
{
String s = new String(buff);
textarea.append(s);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(bfr!=null) bfr.close();
if(fr!=null)fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建FileCount类对象,统计文本中的行数、字符数和词数
FileCount filecount = new FileCount(this.filename);
filecount.count();
textarea.append("\n\nSysmbols are "+filecount.getSymbols()+"\nwords are "+filecount.getWords()+
"\nlines are "+filecount.getLines());
20
20
20
20
300
535
100
200
10
15
10
15
10
15
20
30
100
200
20
30
30
30
60
100
40
70
5
5
15
25
380
655