一、项目简介
源码地址:https://gitee.com/jie140367/WordCount2
作业地址:https://edu.cnblogs.com/campus/xnsy/Test/homework/2203
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
wc.exe -s //递归处理目录下符合条件的文件
2.开发环境:Idea 2017
3.开发语言:Java
4.使用工具:exe4j(将java打包好的jar包转化为exe可执行文件)
exe4j下载地址:https://www.softpedia.com/get/Authoring-tools/Setup-creators/exe4j.shtml
exe4j教程:https://blog.csdn.net/xiazdong/article/details/7225734
二、项目实现
首先放上我的项目目录:
在拿到这个问题之后,首先要把文档抽象出一个对象,属性包含有字符数,单词数和行数。所以创建了一个java Pojo对象类——Wc.java
packagecom.jie;/*** @Author: jie140
* @Date: 2018/10/20 20:59*/
public classWc {//定义字符
public intchars;//定义单词
public intwords;//定义行数
public intlines;public intgetChars() {returnchars;
}public intgetWords() {returnwords;
}public intgetLines() {returnlines;
}public Wc(int chars, int words, intlines) {this.chars =chars;this.words =words;this.lines =lines;
}
}
之后还有接受参数的主启动类——Main.java
package com.jie;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static String inputFile; //输入文件
public static String outputFile; //输出字符文件
public static boolean inputC; //判断是否统计字符数 -c
public static boolean inputW; //判断是否统计单词数 -w
public static boolean inputL; //判断是否统计行数 -l
public static boolean inputO; //判断是否输出 -o
public static void main(String[] args) {
//初始化输入文件
inputFile = "C:\\Users\\Administrator\\Desktop\\作业.txt";
for (int i = 0; i < args.length; i++) {
if ("-c".equals(args[i])) {
inputC = true;
} else if ("-w".equals(args[i])) {
inputW = true;
} else if ("-l".equals(args[i])) {
inputL = true;
} else if ("-o".equals(args[i])) {
inputO = true;
//-o紧挨着输出文件名
outputFile = args[i + 1];
} else {
//如果遇到文件名参数,且前面不是-o,-o后面紧挨着输出文件,那么这个文件就是输入文件
if (!args[i - 1].equals("-o")) {
inputFile = args[i];
}
}
}
String outputStr = "";
//输入文件
String fileNames = inputFile;
String fn;
fn = fileNames;
//分割出实际文件名
String fileShortName = fn.substring(fn.lastIndexOf("\\") + 1, fn.length());
if (inputC || inputW || inputL) {
Wc wc = StatisticalCount.OutPutCount(fn);
if (inputC) {
outputStr += fileShortName+", char: "+wc.getChars()+"\r\n";
}
if (inputW) {
outputStr += fileShortName+", word: "+wc.getWords()+"\r\n";
}
if (inputL) {
outputStr += fileShortName+", line: "+wc.getLines()+"\r\n";
}
}
System.out.println(outputStr);
if (!inputO) {
//如果没有给输出参数,输出到默认文本中
outputFile = "result.txt";
}
try {
//否则定义新文件,输出到新文件中
File writeName = new File(outputFile);
writeName.createNewFile();
BufferedWriter out = new BufferedWriter(new FileWriter(writeName));
out.write(outputStr);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
其中的逻辑实现类比较复杂,所以又创建了一个专门返回Wc对象的类——StatisticalCount.java,传入空的Wc对象,经过逻辑处理,返回一个具有字符数,单词数和行数的Wc对象。最后打印出来并保存到文件result.txt中。
package com.jie;
import java.io.*;
/**
* @Author: jie140
* @Date: 2018/10/20 20:59
*/
public class StatisticalCount {
public static Wc OutPutCount(String fileName)
{
//初始化文件的系数值
Wc wc=new Wc(0,0,0);
//当前字符
char charNow;
try
{
//创建文件并读取
File filename = new File(fileName);
InputStreamReader reader = new InputStreamReader(
new FileInputStream(filename));
BufferedReader br = new BufferedReader(reader);
//读取一行的数据
String line ;
line = br.readLine();
//是否分割
boolean partition=true;
while (line != null)
{
//获取一行中字符长度
wc.chars+=line.length();
wc.lines++;
for(int i=0;i
{
//当前字符
charNow=line.charAt(i);
//分割出单词
if(partition==true&&charNow!=' '&&charNow!='\t'&&charNow!=','&&charNow!=',')
{
wc.words++;
}
//分割
if(charNow==' '||charNow=='\t'||charNow==','||charNow==',')
{
partition=true;
}
}
line = br.readLine();
}
//加上回车长度
wc.chars+=wc.lines-1;
br.close();
}
catch (IOException e)
{
e.printStackTrace();
}
return wc;
}
}
三、测试项目
1、等价类划分:
输入
有效等价类
无效等价类
wc.exe -参数 文件
参数-c
除了-c,-w,-l,-o之外的参数输入,错误的文件名
参数-l
参数-w
参数-o
正确存在的文件名
2、测试:
输入
结果
wc.exe -c
作业.txt, char: 37
wc.exe -l
作业.txt, line: 4
wc.exe -w
作业.txt, word: 31
wc.exe -c -w
作业.txt, char: 37
作业.txt, word: 31
wc.exe -c -w -o result2.txt
作业.txt, char: 37
作业.txt, word: 31
wc.exe -z
文件无输出
3.测试文件内容
4.执行结果
四、项目总结
该项目主要运用到的思想是 面向对象的思想。
1:通过外部dos命令传入到Main函数中args数组中,通过循环和条件语句进行分功能运行。
2.使用了exe4j之后会弹窗,不能输出控制台语句。
3.调用-c -w -l 的功能中间使用到了大量的IO知识和文件操作,不了解的小伙伴请多参考几篇博客进行知识补充。