word count
码云:https://gitee.com/xinlier/git_wc
1.项目要求:
实现对文件内容的单词、字符、行数的统计,并将结果输出到文件中,可以是用户指定的输入文件,也可以是程序自动生成的默认文件result,并且result和wc.exe同级
2.基本功能:
wc.exe [选项...] [需要统计的文件名]或者wc.exe [选项...] [需要统计的文件名] [-o] [存放结果的文件名]
eg:wc.exe -c file.txt
eg:wc.exe -c -l -w file1.txt -o file2.txt
注意:第一个选项只能输入:-c(统计字符数)、-l(统计行数)、-w(统计单词数)。如果要将结果输入到指定的文件,使用命令选项-o,并且后面跟文件名,注意-o命令不能单独使用。
可以在参数一的位置上输入多个选项以统计不同的数据,如:wc.exe -c -l -w file.txt
空格、水平制表符、换行符,均算字符,由空格或者逗号分隔开的都视为单词,并且不做单词的有效性检测,如sdaf@ 算一个单词
3.基本功能:
1.-c 文件名:统计文件字符数
2.-w 文件名:统计文件单词书
3. -l 文件名:统计文件行数
4.-o 文件名:将结果输出到指定文件中
4.psp开发表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
600 |
1200 |
· Estimate |
· 估计这个任务需要多少时间 |
240 |
1200 |
Development |
开发 |
120 |
240 |
· Analysis |
· 需求分析(包括学习新技术) |
30 |
20 |
· Design Spec |
· 生成设计文档 |
60 |
120 |
· Design Review |
· 设计复审(和同事审核设计文档) |
20 |
10 |
· Coding Standard |
· 代码规范(为目前的开发制定合适的规范) |
30 |
50 |
· Design |
· 具体设计 |
60 |
120 |
· Coding |
· 具体编码 |
240 |
300 |
· Code Review |
· 代码复审 |
60 |
100 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
10 |
50 |
Reporting |
报告 |
120 |
60 |
· Test Report |
· 测试报告 |
30 |
30 |
· Size Measurement |
· 计算工作量 |
600 |
1200 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
120 |
150 |
|
合计 |
2310 |
4840 |
5.表格分析:
从表格看,预估时间和实际开发时间相差很大,导致这个结果的原因在于开发者经验不足,并且没有实际深入的研究开发所需要的时间,所以在之后的开发中就应该注意这些文题
6.设计思路:
1.首先结合用户的需求设计需要实现的功能,并且结合实际选择开发语言。
2.设计类图,搭好程序的框架,并且分析这样的设计效率高不高。如果可行,就开始具体的编码。
3.程序分为4个类:
1.start:用与启动程序
2.getUserInpu:用来得到用户的输入,粗略判断输入是否合法,返回输入
3.PrintToFile:创建文件、将统计结果输出到文件中
4.getFile:检测输入合法性、统计数据
4.运行截图:
7.部分代码
1 package wc; 2 3 import java.io.BufferedReader; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.util.ArrayList; 8 9 public class GetFile { 10 public void getFile(String[] input) throws IOException { 11 int charNum = 0; 12 int wordsNum = 0; 13 int lineNum = 0; 14 boolean iso = false;//judege if there is the choice "-o"; 15 PrintToFile printToFile = new PrintToFile(); // 创建printtofile对象 16 String partOfUrl = "/Users/macbook/"; 17 ArrayList<String> fileName = new ArrayList<String>(); //将用户输入的文件名装入集合中 18 ArrayList<String> Choice = new ArrayList<String>(); // 将用户的选项存入这个list集合 19 for (String cell : input) { 20 if (cell.startsWith("-")) { 21 Choice.add(cell); 22 } else if (cell.endsWith(".c") || cell.endsWith(".txt") || cell.endsWith(".docx")) { 23 fileName.add(cell);//将相应的文件装入list中 24 } else { 25 System.out.println("输入格式不对"); 26 System.exit(1); 27 } 28 } 29 if (fileName.size() == 0) { 30 System.out.println("没有输入文件名"); 31 System.exit(1); 32 } 33 String fileUrl = partOfUrl + fileName.get(0); // 得到完整的文件路径,filename(0)是要统计的文件 34 String result = null;//用于存储结果 35 InputStreamReader isr = new InputStreamReader(new FileInputStream(fileUrl));// 获得文件内容 36 BufferedReader br = new BufferedReader(isr); 37 while (br.read() != -1) { 38 String s = br.readLine(); 39 charNum += s.length(); 40 wordsNum += s.split(" ").length; 41 lineNum++; 42 } 43 // 首先判断用户的输入中有没有-o选项 44 for (String choice : Choice) { 45 if(choice.equals("-o")&&fileName.size()!=2) { 46 System.out.println("输入格式不对"); 47 System.exit(1); 48 } 49 if (choice.equals("-o") && fileName.size() == 2) {// 首先调用createFile(String fileName)再调用OutputToUserFile(String result) 50 iso = true; 51 String path = printToFile.createFile(fileName.get(1));// 创建用户指定文件,并且得到文件路径 52 for (String ch : Choice) { 53 if (ch.equals("-c")) { 54 result = fileName.get(0)+",字符数:" + String.valueOf(charNum); 55 System.out.println(result); 56 printToFile.OutputToUserFile(result, path); 57 } else if (ch.equals("-w")) { 58 result = fileName.get(0)+",单词数:" + String.valueOf(wordsNum); 59 System.out.println(result); 60 printToFile.OutputToUserFile(result, path); 61 } else if (ch.equals("-l")) { 62 result = fileName.get(0)+",行数:" + String.valueOf(lineNum); 63 System.out.println(result); 64 printToFile.OutputToUserFile(result, path); 65 } 66 } 67 } 68 } 69 if(iso==false) { 70 for (String choose : Choice) { 71 if (choose.equals("-c")) {// 输出字符数 72 result = fileName.get(0)+"字符数:" + String.valueOf(charNum); 73 System.out.println(result); 74 printToFile.outPutToFile(result); 75 } else if (choose.equals("-w")) {// 输出单词数 76 result = fileName.get(0)+",单词数:" + String.valueOf(wordsNum); 77 System.out.println(result); 78 printToFile.outPutToFile(result); 79 } else if (choose.equals("-l")) {// 输出行数 80 result = fileName.get(0)+",行数:" + String.valueOf(lineNum); 81 System.out.println(result); 82 printToFile.outPutToFile(result); 83 } else { 84 System.out.println("输入格式不正确"); 85 System.exit(1); 86 } 87 } 88 } 89 br.close();// 关闭输出流对象 90 } 91 92 }
package wc; import java.util.Scanner; public class getUserInput { public String[] getInput() {// 从命令行获取用户的输入,将输入切分为几个目标字符串,并做输入长度判断 Scanner scan = new Scanner(System.in); String getInput = null;//获得用户输入的变量 while (getInput == null) { getInput = scan.nextLine();// 读取一行的输入,并且检测是否有输入 } String[] input = getInput.split(" "); // 将用户的输入切分成各个目标字符串 if(input.length>6||input.length<2) {//输入长度判断 System.out.println("非法输入"); System.exit(1); } scan.close(); return input; } }
package wc; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class PrintToFile { public void outPutToFile(String str) throws IOException {// 将用户的输入写入文件中 PrintToFile own = new PrintToFile(); String filePath = null; filePath = own.createFile("result.txt"); File file = new File(filePath); boolean isFile = file.exists();//检测文件是否存在 if (isFile == false) {//文件不存在则创建一个新的名为result.txt的文件 file.createNewFile(); } FileWriter fw = new FileWriter(filePath,true);//以追加的方式写入文件 fw.write(str+"\n"); fw.close(); /*PrintWriter outPut = new PrintWriter(file); outPut.print(str);//重写的方式写入文件中 outPut.close();*/ } public void OutputToUserFile(String result,String path) throws IOException {//将结果写入用户指定的文件中 File file = new File(path); FileWriter fw = new FileWriter(file); fw.write(result+"\n"); fw.close(); } public String createFile(String fileName) throws IOException{//创建用户指定文件 File directory = new File("."); String Path = directory.getCanonicalPath(); String filePath = Path+"/"+fileName; File file = new File(filePath); if(file.exists()==false) {//if the file don't exist,then create file.createNewFile(); } return filePath; } }
package wc; public class Start { public static void main(String[] args) throws Exception { // String path="/Users/macbook/hello.c"; getUserInput getStr = new getUserInput(); String[] input = getStr.getInput();// 得到用户的输入 GetFile getfile = new GetFile(); getfile.getFile(input);//调用文件操作类 } }
8.总结
首先,感谢老师布置的这次作业,这次作业有很多地方是需要我去学习的,并且通过这个作业我了解到了很多东西,学到很多新的知识。在一开始做这个作业的时候就觉得没有什么难的东西,通过编码实现了基本的功能。但是之后才发现,编码仅仅是这次作业的一小部分,而且并不是最消耗时间的。这次作业需要学习git,学习怎样用git去管理项目。然后花了很多时间去学git,刚开始学的时候简直让人摸不着头脑,最好笑的是我连git是什么都不知道,张什么养也不知道,因为以前没有听说过。然后就觉得这个东西很难,不过随着学习的深入了解了git,并掌握了git的基础的用法。突然感觉打开了一个前所未有的天地,觉得还有git这么神奇的东西。但是在学习的过程中遇到了很多的麻烦,这些麻烦都是和棘手的,第一不知道怎样去描述问题来查阅相关资来,第二不知道问题出在哪里,对于这些完全就是陌生的。就像电箱坏了,要查处坏的地方,但是打不开电箱并且不了解电箱一样的难受。好在通过分析和耐心理理清了解决问题的思路。最后完成了git这一块。但是问题又来了,怎样去打包java项目,并且做成exe文件。查阅了相关资料后,费了半天的时间才学会将打包成exe文件。就这样,这次作业终于做完,有一种前所未有的成就感,因为在这次作业上面花费了太多的时间和太多的精力。总的来说,通过这次作业收获非常大,学到的东西非常,也懂了个人开发程序的基本流程。
引用:
exe4j教程:https://blog.csdn.net/sunkun2013/article/details/13167099