一.Gitee地址:https://gitee.com/zjgss99/WordCount

二.项目分析:

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

命令格式:

wc.exe [para] <filename> [para] <filename> ... -o <filename>

基础功能:

-c:统计文件中的字符数,不包括换行符;

-w:统计文件中的单词数;

-l:统计文件的行数;

-o:指定输出文件;

三.PSP表格:

PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 15 10
· Estimate · 估计这个任务需要多少时间 15 10
Development 开发 400 660
· Analysis · 需求分析(包括学习新技术) 30 90
· Design Spec · 生成设计文档 30 20
· Design Review · 设计复审(和同事审核设计文档) 10 20
· Coding Standard · 代码规范(为目前的开发制定合适的规范) 5 5
· Design · 具体设计 30 15
· Coding · 具体编码 240 450
· Code Review · 代码复审 40 30
· Test · 测试(自我测试,修改代码,提交修改) 15 30
Reporting 报告 65 35
· Test Report · 测试报告 20 10
· Size Measurement · 计算工作量 15 10
· Postmortem & Process improvement Plan · 事后总结,并提出过程改进计划 30 15 
  合计 480

705

四.解题思路:

项目大致分为三个部分:

1)对用户输入的命令进行判断,读取文件,处理,传递参数给功能处理部分

2)对几种命令对应的功能分别进行实现,接收参数

3)根据命令将输出结果保存到相应的输出文件中

项目构成:

1)主函数:

读取文件,对用户输入的命令分别调用功能处理模块,并对一些异常情况做处理

2)功能处理模块:

对基本功能进行实现,通过主函数传递的参数确定需要输出的输出文件及输出文件需要的内容。

五.代码展示:

1)模块处理方法(通过主方法传递的参数确定输出内容)

import java.io.*;

public class Handle {

    int line = 0;
int word = 0;
int charnum = 0; public void deal(String readPath,String writePath, String flag) {
boolean flagexist = true;
try {
String str = "";
String[] linenum;
File file = new File(readPath);
BufferedReader br = new BufferedReader(new FileReader(readPath));
try {
try {
while ((str = br.readLine()) != null) {
linenum = str.split(",| ");
for (int i = 0; i < linenum.length; i++) {
if (linenum[i] != null)
word++;
}
line++;
charnum += str.length();
}
System.out.println("行数:"+line+ " 单次数:" + word+" 字符数:"+ charnum);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
System.out.println("关闭BufferedReader错误");
}
}
} catch (FileNotFoundException e) {
flagexist = false;
System.out.println("未找到文件.");
}
if(!flagexist){ }
else{
String output = "";
switch (flag){
case "-o":
output = readPath+",字符数:"+charnum;
try{
File outputFile = new File(writePath);
outputFile.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
bw.write(output);
bw.flush();
bw.close();
}catch (IOException e)
{
e.printStackTrace();
}
break;
case "-w":
output = readPath+",单词数:"+word;
try{
File outputFile = new File(writePath);
outputFile.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
bw.write(output);
bw.flush();
bw.close();
}catch (IOException e)
{
e.printStackTrace();
}
break;
case "-l":
output = readPath+",行数:"+line;
try{
File outputFile = new File(writePath);
outputFile.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
bw.write(output);
bw.flush();
bw.close();
}catch (IOException e)
{
e.printStackTrace();
}
break;
case "-c":
output = readPath+",字符数:"+charnum;
try{
File outputFile = new File(writePath);
outputFile.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
bw.write(output);
bw.flush();
bw.close();
}catch (IOException e)
{
e.printStackTrace();
}
break;
}
}
}
}

2)主方法(对用户的输入命令进行处理并传递给功能处理模块)

import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String read = null;
System.out.println("请输入命令(格式:wc.exe [parameter] [input_file_name]):");
try{
String readPath = "file.c";
String writePath = "result.txt";
read = bf.readLine();
// System.out.println(read);
String [] getRead;
getRead = read.split(" ");
if(getRead.length == 3){
if(getRead[0].equals("wc.exe")){
if(getRead[1].equals("-o")){
if(getRead[2].endsWith(".txt")){
Handle handle = new Handle();
writePath = getRead[2];
handle.deal(readPath,writePath,"-o");
}
else {
System.out.println("命令格式输入错误");
}
}
else if(getRead[1].equals("-c")){
if(getRead[2].endsWith(".c")){
Handle handle = new Handle();
readPath = getRead[2];
handle.deal(readPath,writePath,"-c");
}
else {
System.out.println("命令格式输入错误");
}
}
else if(getRead[1].equals("-w")){
if(getRead[2].endsWith(".c")){
Handle handle = new Handle();
readPath = getRead[2];
handle.deal(readPath,writePath,"-w");
}
else {
System.out.println("命令格式输入错误");
}
}
else if(getRead[1].equals("-l")){
if(getRead[2].endsWith(".c")){
Handle handle = new Handle();
readPath = getRead[2];
handle.deal(readPath,writePath,"-l");
}
else {
System.out.println("命令格式输入错误");
}
}
else {
System.out.println("命令格式输入错误");
}
}
else{
System.out.println("可执行文件名输入错误");
}
}
else{
System.out.println("命令输入格式错误.");
}
}catch(Exception e){
e.printStackTrace();
}
}
}

六.测试

正常按格式输入命令

错误的输入

七.参考文献:

java文件操作 https://www.cnblogs.com/xwlych/p/5987022.html

将jar包生成.exe文件 https://blog.csdn.net/u011752272/article/details/80697198

WordCount的更多相关文章

  1. hadoop 2.7.3本地环境运行官方wordcount

    hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...

  2. Hadoop3 在eclipse中访问hadoop并运行WordCount实例

    前言:       毕业两年了,之前的工作一直没有接触过大数据的东西,对hadoop等比较陌生,所以最近开始学习了.对于我这样第一次学的人,过程还是充满了很多疑惑和不解的,不过我采取的策略是还是先让环 ...

  3. Eclipse 执行成功的 Hadoop-1.2.1 WordCount 源码

    万事开头难.最近在学习Hadoop,先是搭建各种版本环境,从2.2.0到2.3.0,再到1.2.1,终于都搭起来了,折腾了1周时间,之后开始尝试使用Eclipse编写小demo.仅复制一个现成的Wor ...

  4. 软件工程:Wordcount程序作业

    由于时间的关系,急着交作业,加上这一次也不是那么很认真的去做,草草写了“Wordcount程序”几个功能,即是 .txt文件的读取,能计算出文件内容的单词数,文件内容的字符数,及行数. 这次选用C来做 ...

  5. Spark源码编译并在YARN上运行WordCount实例

    在学习一门新语言时,想必我们都是"Hello World"程序开始,类似地,分布式计算框架的一个典型实例就是WordCount程序,接触过Hadoop的人肯定都知道用MapRedu ...

  6. MapReduce剖析笔记之一:从WordCount理解MapReduce的几个阶段

    WordCount是一个入门的MapReduce程序(从src\examples\org\apache\hadoop\examples粘贴过来的): package org.apache.hadoop ...

  7. 软件工程-构建之法 WordCount小程序 统计文件中字符串个数,单词个数,词频,行数

    一.前言 在之前写过一个词频统计的C语言课设,别人说你一个大三的怎么写C语言课程,我只想说我是先学习VB,VB是我编程语言的开始,然后接触到C语言及C++:再后来我是学习C++,然后反过来学习C语言, ...

  8. eclipse连hadoop2.x运行wordcount 转载

    转载地址:http://my.oschina.net/cjun/blog/475576 一.新建java工程,并且导入hadoop相关jar包 此处可以直接创建mapreduce项目就可以,不用下面折 ...

  9. Hadoop中wordcount程序

    一.测试过程中 输入命令: 首先需要在hadoop集群中添加文件 可以首先进行查看hadoop集群中文件目录 hadoop fs -ls / hadoop fs -ls -R / hadoop fs ...

  10. Hadoop示例程序WordCount详解及实例(转)

    1.图解MapReduce 2.简历过程: Input: Hello World Bye World Hello Hadoop Bye Hadoop Bye Hadoop Hello Hadoop M ...

随机推荐

  1. How does the vuejs add the query and walk the object?

    让这个老实返回的页面添加特殊路由,这个页面常常都是登录注册.这次我们根据登录举例. 省略 { path:'/login?url=:url', name:'loginfirst', component: ...

  2. css奇淫巧计

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. curl zip上传并且解压

     上传文件: /** * 上传文件 * @param string $file 文件路径 */ function FileUpload($file){ $data = array('file'=> ...

  4. 『The Captain 最短路建图优化』

    The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...

  5. .NET Core中的数据保护组件

    原文地址: PREVENTING INSECURE OBJECT REFERENCES IN ASP.NET CORE 2.0 作者: Tahir Naushad 背景介绍 在 OWASP(开放式 W ...

  6. 深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件

    原文链接: Deep-dive into .NET Core primitives: deps.json, runtimeconfig.json, and dll's 作者: Nate McMaste ...

  7. HashMap扩容全过程

      1.如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办? 默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如Arr ...

  8. EF架构~mysql中时间戳字段被认为是主键自增

    回到目录 如果在mysql中添加了自增字段,用来维护行的版本,那么在EF中会有一个问题,会把它当成是数据表主键,当你的真正主键是自曾时,就会把默认值0拼到生成的SQL语句里,导致你的insert出错, ...

  9. Kafka控制器选举流程剖析

    1.概述 平时在使用Kafka的时候,可能关注的更多的是Kafka系统层面的.今天来给大家剖析一下Kafka的控制器,了解一下Kafka控制器的选举流程. 2.内容 Kafka控制器,其实就是一个Ka ...

  10. 【WCF系列】(四)WCF客户端怎么消费服务

    WCF客户端怎么消费服务 获取服务绑定协议.绑定和地址:实现方式 SvcUtil方式:SvcUtil.exe是一个命令行工具,位于:C:\Program Files (x86)\Microsoft S ...