WorkCount java简易实现读取文件的字符数,行数,单词数

 

1.码云地址:

https://gitee.com/zhuyao1/workCount

2.psp表格

PSP2.1表格

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

 30

20 

· Estimate

· 估计这个任务需要多少时间

 20

10 

Development

开发

 300  

 360

· Analysis

· 需求分析 (包括学习新技术)

 30

 30

· Design Spec

· 生成设计文档

 20    

 30

· Design Review

· 设计复审 (和同事审核设计文档)

 20 

 10

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 15

 15

· Design

· 具体设计

 20

 15

· Coding

· 具体编码

 200      

 360

· Code Review

· 代码复审

 30

 20

· Test

· 测试(自我测试,修改代码,提交修改)

 20

 30

Reporting

报告

 10

 10

· Test Report

· 测试报告

 20  

 10

· Size Measurement

· 计算工作量

20 

 10

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 30

 30

 

合计

 785

 960

 3.需求功能分析

WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。

可执行程序命名为:wc.exe,该程序处理用户需求的模式为:

wc.exe [parameter] [input_file_name]

存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。

我拿到这个问题一开始想的就是要使用java的io流来读取文件,从而判断文件中的单词数,字符数等。

学习java的文件读取和写入。参考链接:https://blog.csdn.net/linzhiqiang0316/article/details/71744340   或https://blog.csdn.net/malik76/article/details/6408726/

4.程序设计

我总共设计了两个类:

 

1.程序的功能类,读取文件的字符,字数,行数。

 1 public String count_word(String filename) throws IOException//统计单词数
 2     {
 3             ...
 4     }
 5     
 6     public String count_char(String filename) throws IOException//统计字符数
 7     {
 8         ...
 9     }
10     
11     public String count_line(String filename) throws IOException//统计行数
12     {
13         ...
14     }
15     

 

2.main函数类,主要用于判断用户的命令,还有一个将结果写入文件的方法

1 public static void main(String[] args) throws IOException
2     {
3         
4         ...
5     }
6 public static void output(String result) throws IOException
7     {
8         ...
9     }

5.具体编码(还有很多不足之处,希望各位提出意见)

功能类:

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;//返回结果
    }

main函数类:

public class cMain {
    static String filepath="G:/eclipse/workCount/result.txt";//设置初始的文件输出路径,有-o命令就对其更改
    public static void main(String[] args) throws IOException
    {
        
        workCount wCount=new workCount();//实例化workCount
        
        List<String> comonds=new ArrayList<>();//创建list存储命令,即-c,-o等选项
        List<String> filenames=new ArrayList<>();//创建list存储文件的路径
        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("-o"))//判断命令中是否含有-o的命令
            {
                for (int j = 0; j < filenames.size(); j++) {
                    switch (comonds.get(i)) {//判断命令并执行
                    case "-c":
                        result+=" "+wCount.count_char(filenames.get(j));
                        break;
                    case "-l":
                        result+=" "+wCount.count_line(filenames.get(j));
                        break;
                    case "-w":
                        result+=" "+wCount.count_word(filenames.get(j));
                        break;
                    default:
                        System.out.println("有命令错误");
                        break;
                    }
                }
                output(result);//将结果输出至文件
            }
            else {//有-o的命令,则最后一个文件路径则是想要输出的文件路径
                filepath=filenames.get(filenames.size()-1);//对输出文件的路径进行更改
                for (int j = 0; j < filenames.size()-1; j++) {
                    switch (comonds.get(i)) {//判断命令并执行
                    case "-c":
                        result+=" "+wCount.count_char(filenames.get(j));
                        break;
                    case "-l":
                        result+=" "+wCount.count_line(filenames.get(j));
                        break;
                    case "-w":
                        result+=" "+wCount.count_word(filenames.get(j));
                        break;
                    default:
                        System.out.println("有命令错误");
                        break;
                    }
                }
                output(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();//关闭流
    }
}

6.对程序的基本测试

因为这个程序涉及args【】内的命令操作,在之前都比较陌生,后来参考了相关的文章,学习到了对其中命令的操作。

参考链接:https://www.cnblogs.com/xy-hong/p/7197725.html

比较详细,可以参考!

7.本程序的本机测试

将Java代码打包为jar文件,并转为exe可执行文件的方法,可参考下面的博客:

https://blog.csdn.net/sunkun2013/article/details/13167099(很详细)

 

 

8.个人项目总结

在这一次的程序设计的过程中,我觉得是收获巨大的,我已开始拿到这个题目,说实话,脑壳痛,不过还是得做嘛,静下心来,一步一步分析,不会就去查,从一个项目之中,不仅学习到的是编程的知识,更多的是如何的一个人学习,在一个项目中你会去翻阅无数的资料,这我觉得才是,真正巨大的收获。这次还涉及到了,git码云的使用,我相信这个在以后的工作中,不一定会用到,但一定能提高我们的能力,自觉性。第一次写博客,写的不好,希望得到建议,谢谢!希望能帮助到人!

posted @ 2018-09-24 16:04  ZhuYao  阅读(1270)  评论(2编辑  收藏  举报