1. 程式人生 > >WordCount統計文檔字符數,單詞數,行數

WordCount統計文檔字符數,單詞數,行數

大量 多個 size edi 劃分 等價 抽象 tst line

一、項目簡介

源碼地址: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;
    //定義行數
    public
int 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
作業.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知識和文件操作,不了解的小夥伴請多參考幾篇博客進行知識補充。

WordCount統計文檔字符數,單詞數,行數