WordCount統計文檔字符數,單詞數,行數
一、項目簡介
源碼地址: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
package com.jie; /** * @Author: jie140 * @Date: 2018/10/20 20:59 */ public class Wc { //定義字符 public int chars; //定義單詞 public int words; //定義行數 publicint lines; public int getChars() { return chars; } public int getWords() { return words; } public int getLines() { return lines; } public Wc(int chars, int words, int lines) { 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; import java.util.ArrayList; public class Main { public static String inputFile; //輸入文件 public static String outputFile; //輸出字符文件 public static boolean needC; //判斷是否統計字符數 -c public static boolean needW; //判斷是否統計單詞數 -w public static boolean needL; //判斷是否統計行數 -l public static boolean needO; //判斷是否輸出 -o public static void main(String[] args) { //初始化輸入文件 inputFile="D:\\項目\\qnmd.txt"; for(int i=0;i<args.length;i++) { System.out.println(args[i]); if ("-c".equals(args[i])) { needC = true; } else if ("-w".equals(args[i])) { needW = true; } else if ("-l".equals(args[i])) { needL = true; } else if ("-o".equals(args[i])) { needO = true; //-o緊挨著輸出文件名 outputFile = args[i + 1]; } else { //如果遇到文件名參數,且前面不是-e和-o,那麽這個文件就是輸入文件 if (!args[i - 1].equals("-e") && !args[i - 1].equals("-o")) { inputFile = args[i]; } } } String outputStr=""; //輸入文件列表 ArrayList<String> fileNames =new ArrayList<String>(); fileNames.add(inputFile); //文件數量 int len=fileNames.size(); String fn; for(int i=0;i<len;i++) { fn=fileNames.get(i); System.out.println(fn); //分割出實際文件名 String fileShortName=fn.substring(fn.lastIndexOf("\\")+1, fn.length()); if(needC||needW||needL) { Wc wc= StatisticalCount.basicInfo(fn); if(needC) { outputStr+=fileShortName; outputStr+=", char: "; outputStr+=wc.getChars(); outputStr+="\r\n"; } if(needW) { outputStr+=fileShortName; outputStr+=", word: "; outputStr+=wc.getWords(); outputStr+="\r\n"; } if(needL) { outputStr+=fileShortName; outputStr+=", line: "; outputStr+=wc.getLines(); outputStr+="\r\n"; } } } System.out.println(outputStr); if(!needO) { //如果沒有給輸出參數,輸出到默認文本中 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 basicInfo(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<line.length();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 |
wc.exe -c -w -o result2.txt |
作業.txt, char: 37 |
wc.exe -z |
文件無輸出 |
3.測試文件內容
4.執行結果
四、項目總結
該項目主要運用到的思想是 面向對象的思想。
1:通過外部dos命令傳入到Main函數中args數組中,通過循環和條件語句進行分功能運行。
2.使用了exe4j之後會彈窗,不能輸出控制臺語句。
3.調用-c -w -l 的功能中間使用到了大量的IO知識和文件操作,不了解的小夥伴請多參考幾篇博客進行知識補充。
WordCount統計文檔字符數,單詞數,行數