---恢复内容开始---
一
合作者: 201631062631 ; 201631062431
代码地址:https://gitee.com/ZzGgJj/WordCountT
本次作业的链接地址:https://edu.cnblogs.com/campus/xnsy/Test/homework/2203
2.1.1 基本功能
wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的单词总数
wc.exe -l file.c //返回文件 file.c 的总行数
wc.exe -o outputFile.txt //将结果输出到指定文件outputFile.txt
2.1.2 扩展功能(未完成)
wc.exe -s //递归处理目录下符合条件的文件
wc.exe -a file.c //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -e stopList.txt // 停用词表,统计文件单词总数时,不统计该表中的单词
[file_name]: 文件或目录名,可以处理一般通配符。
代码
主函数
package workCount; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.charset.MalformedInputException; import java.util.ArrayList; import java.util.List; import org.omg.CORBA.PUBLIC_MEMBER; public class cMain { static String filepath="G:/eclipse/workCount/result.txt";//设置初始的文件输出路径,有-o命令就对其更改 static String stopfile=null;//停词表 static List<String> comonds=new ArrayList<>();//创建list存储命令,即-c,-o等选项 static List<String> filenames=new ArrayList<>();//创建list存储文件的路径 public static void main(String[] args) throws IOException { for(int i=0;i<args.length;i++)//遍历args,将命令和文件路径分开 { if(args[i].startsWith("-")){ comonds.add(args[i]);//添加命令 } else{ filenames.add(args[i]);//添加文件的路径 } } String result="";//存储每一次返回的结果 for(int i=0;i<comonds.size();i++) { /*if(comonds.contains("-x")) { wcUI wUi=new wcUI(); }*/ if(!comonds.contains("-o")&&comonds.contains("-e"))//判断命令中是否含有-o和-e的命令 // 默认若有-o则需要放在岁后面,若有-e,则-e需要在-o前面 { for(int j=0;j<(filenames.size()-1);j++){ System.out.println("1"); stopfile=filenames.get(filenames.size()-1); result+="\n"+selectCommand(comonds.get(i),filenames.get(j)); } output(result);//将结果输出至文件 }else if(comonds.contains("-o")&&comonds.contains("-e")){//有-o的命令,则最后一个文件路径则是想要输出的文件路径 filepath=filenames.get(filenames.size()-1);//对输出文件的路径进行更改 stopfile=filenames.get(filenames.size()-2);//修改停词表路径 for(int j=0;j<(filenames.size()-2);j++){ result+="\n"+selectCommand(comonds.get(i),filenames.get(j)); } output(result);//将结果输出至文件 }else if(comonds.contains("-o")&&!comonds.contains("-e")){ filepath=filenames.get(filenames.size()-1);//对输出文件的路径进行更改 System.out.println(filepath); for(int j=0;j<(filenames.size()-1);j++){ result+="\n"+selectCommand(comonds.get(i),filenames.get(j)); } output(result);//将结果输出至文件 }else { for(int j=0;j<filenames.size();j++){ result+="\n"+selectCommand(comonds.get(i),filenames.get(j)); } output(result);//输出结果至文件 } } } static public String selectCommand(String command,String filename) throws IOException //选择命令,并执行 { String result =""; workCount wCount=new workCount(); // 实例化workCount switch (command) {//判断命令并执行 case "-c": result=wCount.count_char(filename); break; case "-l": result=wCount.count_line(filename); break; case "-w": result=wCount.count_word(filename); break; case "-a": result=wCount.count_moreLine(filename); break; case "-s": result=wCount.recursiveFindFile(filename); break; case "-e": result="使用停词表后单词数为:"+wCount.stopWordList(filename,stopfile); break; case "-o": break; default: System.out.println("有命令错误"); break; } return result;//返回结果 } public static void output(String result) throws IOException{//将结果写入文件 File file=new File(filepath);//定义文件 if(!file.exists()){//判断文件是否存在,不存在则直接创建新文件 file.createNewFile(); } FileWriter fileWriter=new FileWriter(file); BufferedWriter bWriter=new BufferedWriter(fileWriter);//放入缓冲层 bWriter.write(result);//写入数据 bWriter.close();//关闭流 } }
统计单词数
public String count_word(String filename) throws IOException{//统计单词数 //int wordnum=0;//单词数 File file =new File(filename); int x=-1; FileReader fReader=new FileReader(file); while((x=fReader.read())!=-1){//按字符读文件,碰到符合条件的,单词数+1 char a=(char)x; if(a==' '||a==','||a=='.'){ wordnum++; } } String result=filename+",单词数:"+wordnum;//保存结果 fReader.close();//关闭流 return result;//返回结果 }
统计字符数
public String count_char(String filename) throws IOException{//统计字符数 int charnum=0;//字符数 File file=new File(filename); int x=-1; FileReader fReader=new FileReader(file); while((x=fReader.read())!=-1){//按字符读文件,判断,符合则字符加一 char a=(char)x; if(a!='\n'&&a!='\r'){ charnum++; } } String result=filename+",字符数:"+charnum;//保存结果 fReader.close();//关闭流 return result;//返回结果 }
统计行数
public String count_line(String filename) throws IOException{//统计行数 int line=0;//行数 File file=new File(filename); BufferedReader bReader;//缓冲区 bReader=new BufferedReader(new FileReader(file)); while(bReader.readLine()!=null){//对文件进行以行为单位读取,不为空则行数加一 line++; } bReader.close();//关闭流 String result=filename+",总行数:"+line;//保存结果 return result;//返回结果 }
查询代码行 / 空行 / 注释行)
public String count_moreLine(String filename) throws IOException// 返回各种行数 { int noteLine=0; // 注释行 int emptyLine=0; // 空行 int codeLine=0; // 代码行 int sumLine=0; int tag=0; // 设置标记,记录多行注释时的注释代码行数 File file=new File(filename); BufferedReader bReader=new BufferedReader(new FileReader(file)); String s; while((s=bReader.readLine())!=null){ sumLine++; if(s.isEmpty()||s.startsWith("{")&&s.endsWith("{")||s.startsWith("}")&&s.endsWith("}")){ // 对空行的判断 emptyLine++; } if(tag==0){ if(s.contains("//")){ // 判断注释符 noteLine++; }else if(s.contains("/*")){ noteLine++; tag=1; } }else { noteLine++; if(s.contains("*/")){ //判断下一行是否有下一个注释符 tag=0; } } } bReader.close(); codeLine=sumLine-emptyLine-noteLine; String result=filename+",注释行:"+noteLine+",空行数:"+emptyLine+",代码行:"+codeLine; return result; }
递归处理目录下符合条件的文件
public String recursiveFindFile(String filepath) throws IOException//递归 { String result=null; File file=new File(filepath); if(file.isDirectory()){ File[] files=file.listFiles(); if(files.length==0) { System.out.println("空目录"); }else{ for(File f : files) { if(f.isDirectory()) // 判断是否为目录 { recursiveFindFile(f.getPath()); }else if(f.isFile()) { // 判断是否为文件 result+="\n文件名:"+f.getPath()+"\n"+count_word(f.getPath())+ "\n"+count_line(f.getPath())+ "\n"+count_char(f.getPath())+ "\n"+count_moreLine(f.getPath()); } } } }else if(file.isFile()){ // 判断是否直接就为文件 result="文件名:"+filepath+"\n"+count_word(filepath)+ "\n"+count_line(filepath)+ "\n"+count_char(filepath)+ "\n"+count_moreLine(filepath); } return result; }
测试
总结
本次项目采用了Java,实现了Wordcount的基本功能,但在一些非法操作符输入时,并不能正确处理。在需求分析以及结构设计方面仍存在较大问题,不清晰,不明确,严重影响项目开发的进度,同时编程能力不足也是一个因素,思路不清晰,对Java的理解流于表面,实践 能力较弱,导致事倍功半,但对项目开发流程有了深刻认识,为以后的学习提供了帮助。
---恢复内容结束---