一:
合作者: 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
static List
public static void main(String[] args) throws IOException
{
for(int i=0;i
{
if(args[i].startsWith("-")){
comonds.add(args[i]);//添加命令
}
else{
filenames.add(args[i]);//添加文件的路径
}
}
String result="";//存储每一次返回的结果
for(int i=0;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
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的理解流于表面,实践 能力较弱,导致事倍功半,但对项目开发流程有了深刻认识,为以后的学习提供了帮助。