WordCount--統計輸入文件的字符數、行數、單詞數(java)--初級功能

碼云地址:

https://gitee.com/YuRenDaZ/WordCount

個人PSP表格:

PSP2.1

PSP階段

預估耗時

(分鐘)

實際耗時

(分鐘)

Planning

計劃

?180

?120

· Estimate

· 估計這個任務需要多少時間

?180

?120

Development

開發

?580

?440

· Analysis

· 需求分析 (包括學習新技術)

?180

?60

· Design Spec

· 生成設計文檔

?40

?30

· Design Review

· 設計復審 (和同事審核設計文檔)

?20

?20

· Coding Standard

· 代碼規范 (為目前的開發制定合適的規范)

?20

?10

· Design

· 具體設計

?20

?20

· Coding

· 具體編碼

?180

?200

· Code Review

· 代碼復審

?30

?40

· Test

· 測試(自我測試,修改代碼,提交修改)

?90

?60

Reporting

報告

?90

?70

· Test Report

· 測試報告

?40

?30

· Size Measurement

· 計算工作量

?20

?10

· Postmortem & Process Improvement Plan

· 事后總結, 并提出過程改進計劃

?30

?30

?

合計

?850

?630

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

一、功能需求分析

  WordCount的需求可以概括為:對程序設計語言源文件統計字符數、單詞數、行數,統計結果以指定格式輸出到默認文件中,以及其他擴展功能,并能夠快速地處理多個文件。可執行程序命名為:wc.exe,該程序處理用戶需求的模式為:

wc.exe [parameter] [input_file_name]

存儲統計結果的文件默認為result.txt,放在與wc.exe相同的目錄下。

詳細分析:

?功能 -c?? :返回文件 file.c 的字符數

?功能 -w?? :返回文件 file.c 的單詞總數

?功能 -l???? :返回文件 file.c 的總行數

?功能 -o??? :將結果輸出到指定文件outputFile.txt

?要求 : 1. -o 功能后面必須有輸出文件路徑的參數。

    2.在沒有 -o 命令指定輸出文件的時候默認將結果保存在exe同目錄下的result.txt。

    3.可以滿足多個文件同時查詢。

注意:

空格,水平制表符,換行符,均算字符。

由空格或逗號分割開的都視為單詞,且不做單詞的有效性校驗,例如:thi#,that視為用逗號隔開的2個單詞。

?

二、程序設計

A:大概設計

  ? 1):程序由工具類和主函數類構成。

  ???? 2):程序使用main的入口參數。

B:詳細設計

  1):將每一個“-?”指令對應一個方法。

   ? 2):將功能方法寫在一個類里,作為工具類。

   ? 3):使用條件判斷語句來處理命令。

   ? 4):用集合存儲需要查詢的文件,以方便進行添加和遍歷。

   ? 5):程序主要邏輯在main函數中進行。(邏輯并不非十分復雜)

三、程序編碼(編碼并不是最好的實現方法,希望各位同學能指出不足之處,我們大家一起進步!)

  • 主函數邏輯主要是由循環語句和條件判斷語句完成。代碼如下:
     1 import java.util.HashSet;
     2 import java.util.Set;
     3 
     4 public class WordCount {
     5     
     6     public static void main(String[] args) {
     7         CountUtil countUtil = new CountUtil();//實例化工具類對象
     8         Set<String> file_paths = new HashSet<String>() ; //創建用于存儲輸入文件的集合
     9         String Output_file = "result.txt"; //存儲輸出文件名(默認為同目錄下的result.txt文件)
    10         String Result = ""; //存儲查詢結果
    11         boolean isCharacters = false; //是否查詢字符數
    12         boolean isLines = false; //是否查詢行數
    13         boolean isWords = false; //是否查詢單詞數
    14         for (int i = 0;i<args.length;i++) { //循環讀取入口參數
    15             if (args[i].startsWith("-")) { //判斷是否是命令
    16                 switch (args[i]) {
    17                 case "-c":
    18                     isCharacters = true; //是-c指令,激活查詢條件
    19                     break;
    20                 case "-l":
    21                     isLines = true; //是-l指令,激活查詢條件
    22                     break;
    23                 case "-w":
    24                     isWords =true; //是-w指令,激活查詢條件
    25                     break;
    26                 case "-o":
    27                     if(!args[i+1].startsWith("-")) //-o指令 判斷后面是否有指定輸出文件
    28                     {
    29                         Output_file = args[i+1]; //args[i+1]必須為輸出文件
    30                         i++;
    31                     }else {
    32                         System.out.println("input error !"); //提示輸入錯誤并終止程序
    33                         System.exit(0);
    34                     }
    35                     break;
    36                 default:
    37                     System.out.println("input error !");
    38                     break;
    39                 }
    40             }
    41             else file_paths.add(args[i]); //將不屬于命令的字符串存儲在集合里面
    42         }
    43         
    44         if (isWords) {
    45             Result+=countUtil.ReturnWords(file_paths)+"\r\n"; //調用查詢單詞方法,并做字符串拼接
    46         }
    47         if (isLines) {
    48             Result+=countUtil.ReturnLines(file_paths)+"\r\n"; //調用查詢行數方法,并做字符串拼接
    49         }
    50         if (isCharacters) {
    51             Result+=countUtil.ReturnCharacters(file_paths)+"\r\n"; //調用查詢字符數方法,并做字符串拼接
    52         }
    53             System.out.println(Result);
    54             countUtil.OutputFile(Output_file, Result); //將結果輸出到文件
    55     }
    56 }

    ?

  • 在工具類中各方法的實現:(基本上都是基于IO流的操作)

  ReturnCharacters方法,返回查詢結果(String類型),參數為輸入文件的集合。代碼如下:

public String ReturnCharacters(Set<String> file_paths) {int Count = 0,bytes = 0;String result = "";//用于存儲返回值byte [] tem = new byte[20*1024];//用存儲讀取數據的定常字節數組int len = tem.length;//得到tem的長度以避免循環時反復調用.lengthFileInputStream in = null;//聲明一個文件輸入流try {for (String file_path : file_paths) {in = new FileInputStream(file_path);//得到字符輸入流,string為文件絕對路徑         while ((bytes = in.read(tem,0,len))!=-1) {Count+=bytes;//統計累計讀取的字符數
                }result += file_path+",字符數:"+Count+"    ";//結果字符串拼接Count = 0;}    } catch (FileNotFoundException e) {System.out.println("有文件輸入錯誤,請核對!(如果不會使用相對路徑,請使用絕對路徑)"); //檢查到文件不存在,提示錯誤System.exit(0); //結束程序} catch (IOException e) {e.printStackTrace();}finally {try {in.close();//關閉輸入流} catch (IOException e) {e.printStackTrace();}}return result;}
返回字符數

  ReturnWords方法,返回查詢結果(String類型),參數為輸入文件的集合。代碼如下:

 1     public String ReturnWords(Set<String> file_paths){
 2         int Count = 0; //存儲單詞數
 3         String result = "";//存儲返回值
 4         StringBuffer saveString = new StringBuffer();//因為string具有不可變性,用StringBuffer來進行讀取的添加
 5         String tmp = ""; //緩存字符串
 6         FileInputStream in = null;//聲明文件字符輸入流
 7         InputStreamReader isr = null;//聲明字節輸入流
 8         BufferedReader bis = null;//聲明緩存輸入流
 9         try {
10             for (String file_path : file_paths) {   //foreach循環遍歷數組
11                 in = new FileInputStream(file_path);//實例化文件輸入流對象
12                 isr = new InputStreamReader(in);//實例化字節輸入流對象
13                 bis = new BufferedReader(isr);//實例化緩存輸入流對象
14                 while ((tmp=bis.readLine())!=null) { //readLine()返回讀取的字節,若沒有了就返回null
15                     saveString.append(tmp); //將新讀出來的數據接在已保存的后面
16                 }
17                 tmp = saveString.toString(); //用字符串存儲,以用split方法區分單詞
18                 String [] total = tmp.split("[\\s+,\\.\n]");//用正則表達式將字符串按單詞格式分開
19                 Count = total.length; //字符串數組長度就是單詞個數
20                 result += file_path+",單詞數:"+Count+"    "; //結果字符串拼接
21                 Count = 0;
22             }
23         } catch (FileNotFoundException e) {
24             System.out.println("有文件輸入錯誤,請核對!(如果不會使用相對路徑,請使用絕對路徑)"); //檢查到文件不存在,提示錯誤
25             System.exit(0); //結束程序
26         } catch (IOException e) {
27             e.printStackTrace();
28         }finally {
29             try {
30                 in.close();//關閉文件字符輸入流
31                 isr.close();//關閉字節輸入流
32                 bis.close();//關閉緩存輸入流
33             } catch (IOException e) {
34                 e.printStackTrace();
35             }
36             
37         }
38         return result;
39     }
返回單詞數

  ReturnLines方法,返回查詢結果(String類型),參數為輸入文件的集合。代碼如下:

 1 public String ReturnLines(Set<String> file_paths) {
 2         int Count = 0;
 3         String result = "";
 4         FileInputStream in = null;//聲明文件字符輸入流
 5         InputStreamReader isr = null;//聲明字節輸入流
 6         BufferedReader bis = null;//聲明緩存輸入流
 7         try {
 8             for (String file_path : file_paths) {   //foreach循環遍歷數組
 9                 in = new FileInputStream(file_path);//實例化文件輸入流對象
10                 isr = new InputStreamReader(in);//實例化字節輸入流對象
11                 bis = new BufferedReader(isr);//實例化緩存輸入流對象
12                 while (bis.readLine()!=null) {
13                     Count++;
14                 }
15                 result += file_path+",行數:"+Count+"    "; //結果字符串拼接
16                 Count = 0;
17             }
18         } catch (FileNotFoundException e) {
19             System.out.println("有文件輸入錯誤,請核對!(如果不會使用相對路徑,請使用絕對路徑)"); //檢查到文件不存在,提示錯誤
20             System.exit(0); //結束程序
21         } catch (IOException e) {
22             e.printStackTrace();
23         }finally {
24             try {
25                 in.close();//關閉文件字符輸入流
26                 isr.close();//關閉字節輸入流
27                 bis.close();//關閉緩存輸入流
28             } catch (IOException e) {
29                 e.printStackTrace();
30             }
31             
32         }
33         return result;
34     }
返回行數

  OutputFile方法,將結果保存在文件中,返回boolean型,參數為文件路徑和內容。代碼如下:

 1     public boolean OutputFile(String File_path,String Context){
 2         File OutputFile = new File(File_path); //創建File對象
 3         FileOutputStream os = null; //聲明 文件輸出流
 4         byte [] a = null; //用于存儲Context轉化的byte字節數組
 5         try {
 6             if(!OutputFile.exists()) {        //判斷文件是否存在
 7                     OutputFile.createNewFile(); //不存在,創建一個文件
 8             }
 9             os = new FileOutputStream(OutputFile); //獲得輸出流對象
10             a = Context.getBytes(); //將Context轉化為Byte數組,以便寫入文件
11             os.write(a); //將byte數組寫入文件
12         } catch (IOException e) {
13             e.printStackTrace();
14         }finally {
15             try {
16                 os.close(); //關閉輸出流
17             } catch (IOException e) {
18                 e.printStackTrace();
19             }
20         }
21         return true;
22     }
23 }
輸出結果文件

?

四、代碼測試

  代碼調試方法參照 https://www.cnblogs.com/xy-hong/p/7197725.html

由于是使用的main函數的入口參數,所以之前并未接觸過這類方式的程序編寫。在經過查閱后在改文章上找到了調試方式。具體操作再次不予詳述,請參照以上鏈接。

   ? 因為要求不能用已有得測試框架進行測試,所以就自己設計了一個測試類。在類中,分為單獨針對每一個需要測試得方法都設計一個測試方法,然后再主函數中調用達到一次性全部測試得效果。

    

import java.util.HashSet;
import java.util.Set;public class ProTest {public static void main(String[] args) {testOutputFile();testReturnCharacters();testReturnLines();testReturnWords();}public static void testReturnCharacters() {Set<String> file_paths = new HashSet<String>();String file1 = "F://test.c";String file2 = "F://test.java";file_paths.add(file2);file_paths.add(file1);System.out.println("testReturnCharacters():");System.out.println(new CountUtil().ReturnCharacters(file_paths));}public static void testReturnWords() {Set<String> file_paths = new HashSet<String>();String file1 = "F://test.c";String file2 = "F://test.java";file_paths.add(file2);file_paths.add(file1);System.out.println("testReturnWords():");System.out.println(new CountUtil().ReturnWords(file_paths));}public static void testReturnLines() {Set<String> file_paths = new HashSet<String>();String file1 = "F://test.c";String file2 = "F://test.java";file_paths.add(file2);file_paths.add(file1);System.out.println("testReturnLines():");System.out.println(new CountUtil().ReturnLines(file_paths));}public static void testOutputFile() {String file_path  = "result.txt";String context = "OutPutFile test !";if(new CountUtil().OutputFile(file_path, context)) {System.out.println("File output success !");}else {System.out.println("error !");}}
}

?

直接運行測試類,得到結果:

  

?

用例測試:

      

文件中的結果:

      

?

?

?

?

?

?

五、將項目導出為exe可執行文件

  依賴工具:exe4j

   ? 參考方法:手把手教你如何把java代碼,打包成jar文件以及轉換為exe可執行文件(注意:改博客中沒有指出32位和64位系統的差別,具體如下)

          

六、項目與遠程庫同步過程(碼云)

  有關git和碼云項目的遠程連接以及工作提交等相關操作參考Git和Github簡單教程(該教程非常的詳細,值得推薦。

   ?本項目一共有三次項目提交,分別是初始代碼、復審代碼、測試后修改的最終代碼。

七、個人總結

  第一次撰寫博客有很多迷茫之處,但是在撰寫博客的過程中我發現這其實是對整個項目過程的一次回顧與反思。在以前的作業中,通常都是寫完代碼測試完后就不再關注,也不會反在完成項目的途中犯過什么樣的錯誤。每當下次遇到同樣的問題還是會被困擾住,所以我覺得寫博客是真的有必要的。雖然寫出來的博客沒人看,沒人會在意,但是這并不是開始學習的我們的目的。我們的目的就在于回顧過程,反思過程中的錯誤,讓項目的過程在我們腦海里留下更深的印象。最后,這次的作業的量還是算比較大的,但是卻真的能感覺到有很多的收獲。很多東西都是詞不達意的,真的用心體會過就能明白。

   ? 感謝以上引用的各鏈接的作者們,希望你們的文章能幫助更多的人。

轉載于:https://www.cnblogs.com/YuRenX/p/9693943.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279289.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279289.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279289.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網頁的驗證碼

1.首先可以寫一個產生隨機驗證碼的aspx文件&#xff0c;如下產生四位數字&#xff1a; private void Page_Load(object sender, System.EventArgs e) { this.CreateCheckCodeImage(GenerateCheckCode()); } private string GenerateCheckCode() { …

榮耀9igoogle模式_iGoogle個性化主頁的6種替代方法

榮耀9igoogle模式iGoogle has less than a year to go before it’s shut down for good on November 1, 2013. While Google seems to think that iGoogle isn’t necessary anymore, there are other services waiting to take its place. iGoogle距離其2013年11月1日永久關閉…

華為堡壘機_安恒信息成為“華為云優秀嚴選合作伙伴”,攜手保障“云上”資產安全訪問...

加快5G持續創新能力&#xff0c;為云計算行業注入新動能。近日&#xff0c;以“智者?同行?共贏”為主題的2020華為云ISV(嚴選)合作伙伴大會在杭州隆重舉行。上百位華為云合作伙伴、行業大咖等專業人士齊聚一堂&#xff0c;探討云計算產業熱門話題。作為華為云重要的生態合作伙…

zip4j實現多線程壓縮

使用的jar包&#xff1a;zip4j_1.3.2.jar 基本功能&#xff1a; 針對ZIP壓縮文件創建、添加、分卷、更新和移除文件 (讀寫有密碼保護的Zip文件) (支持AES 128/256算法加密) (支持標準Zip算法加密) (支持zip64格式) (支持Store(僅打包&#xff0c;默認不壓縮&#xff0c;…

非三星手機無法登錄三星賬號_如何解決所有三星手機的煩惱

非三星手機無法登錄三星賬號Samsung is the biggest manufacturer of Android phones in the world, but that doesn’t mean these handsets are perfect out of the box. In fact, most of these phones have several annoyances initially—here’s how to fix many of thes…

設置單元格填充方式_單元格的選擇及設置單元格格式

數據輸入完畢&#xff0c;接下來可以設置字體、對齊方式、添加邊框和底紋等方式設置單元格格式&#xff0c;從而美化工作表。要對單元格進行設置&#xff0c;首先要選中單元格。選擇單元格選擇單元格是指在工作表中確定活動單元格以便在單元格中進行輸入、修改、設置和刪除等操…

Recover Binary Search Tree

Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Note: A solution using O(n) space is pretty straight forward. Could you devise a constant space solution? 要求找到BST中放錯位置的兩個節點. …

springboot三種過濾功能的使用與比較

若要實現對請求的過濾&#xff0c;有三種方式可供選擇&#xff1a;filter、interceptort和aop。本文主要討論三種攔截器的使用場景與使用方式。 下文中的舉例功能是計算每個請求的從開始到結束的時間&#xff0c;例子來源是慕課網。 一、filter 特點&#xff1a;可以獲取原始的…

后綴的形容詞_構詞法(18)構成形容詞的常見后綴 3

即時練習一、按要求改寫下列單詞。1. Japan →___________ adj. 日本(人)的2. Canton →_________ adj. 廣東(人)的3. Vietnam →__________ adj. 越南(人)的4. Europe →__________ adj. 歐洲(人)的5. India → ________ adj. 印度(人)的6. Africa →_______ adj. 非洲(人)的7…

CentOS 桌面啟動無登錄界面

最近VMWare下搞了2個CentOS 32bit虛擬機, 裝了些軟件之后&#xff0c;都遇到開機無法顯示登錄界面&#xff0c; 僅能看見桌面背景圖的情況。 以下是我搜索很久匯總的方法。 嘗試按 ctrl alt F3(快捷鍵可能有所不同), 由桌面模式進入命令行模式。 直接 startx 報錯&#xf…

批量刪除推文_如何搜索(和刪除)您的舊推文

批量刪除推文“The internet never forgets” is an aphorism that isn’t entirely true, but it’s worth thinking about whenever you post to social media. If you think your Twitter profile needs a bit of a scrub, here’s how to search and delete those old twee…

[USACO13JAN] Cow Lineup (單調隊列,尺取法)

題目鏈接 Solution 尺取法板子,算是復習一波. 題中說最多刪除 \(k\) 種,那么其實就是找一個顏色種類最多為 \(k1\) 的區間; 統計一下其中最多的顏色出現次數. 然后直接尺取法,然后每次對于 \(col[r]\) 進行統計,時間復雜度 \(O(n)\) . Code #include<bits/stdc.h> using …

智能記憶功能nest_如何設置和安裝Nest Protect智能煙霧報警器

智能記憶功能nestIf you want to add a bit more convenience and safety to your home’s smoke alarm setup, the Nest Protect comes with a handful of great features to make that a reality. Here’s how to set it up and what all you can do with it. 如果您想為您的…

網格自適應_ANSYS 非線性自適應(NLAD)網格劃分及應用舉例

文章來源&#xff1a;安世亞太官方訂閱號&#xff08;搜索&#xff1a;Peraglobal&#xff09;在復雜的結構設計分析中&#xff0c;通常很難確定在高應力區域中是否生成適當的細化網格。在做非線性大應變分析仿真時&#xff0c;可能由于單元變形過大&#xff0c;導致網格畸變&a…

js繼承優化

在看《js設計模式》中&#xff0c;作者提到了js中的兩種繼承方式&#xff1a;類繼承 或 原型繼承&#xff0c;或許是本人才疏學淺&#xff0c;竟發現一些問題。 一、類繼承 思路&#xff1a;作者的思路是使用基于類來繼承&#xff0c;并且做了一個extend函數&#xff0c;在第一…

python---[列表]lsit

內置數據結構&#xff08;變量類型&#xff09; -list -set -dict -tuple -list&#xff08;列表&#xff09; -一組又順序的數據組合 -創建列表 -空列表 list1 []        print(type(list1))        print(list1)        list2 [100]       …

喚醒計算機運行此任務_如何停止Windows 8喚醒計算機以運行維護

喚醒計算機運行此任務Windows 8 comes with a new hybrid boot system, this means that your PC is never really off. It also means that Windows has the permission to wake your PC as it needs. Here’s how to stop it from waking up your PC to do maintenance tasks…

轉整型_SPI轉can芯片CSM300詳解、Linux驅動移植調試筆記

一口君最近移植了一款SPI轉CAN的芯片CSM300A&#xff0c;在這里和大家做個分享。一、CSM300概述CSM300(A)系列是一款可以支持 SPI / UART 接口的CAN模塊。1. 簡介CSM300(A)系列隔離 SPI / UART 轉 CAN 模塊是集成微處理器、 CAN 收發器、 DC-DC 隔離電源、 信號隔離于一體的通信…

matlab練習程序(二值圖像連通區域標記法,一步法)

這個只需要遍歷一次圖像就能夠完全標記了。我主要參考了WIKI和這位兄弟的博客&#xff0c;這兩個把原理基本上該介紹的都介紹過了&#xff0c;我也不多說什么了。一步法代碼相比兩步法真是清晰又好看&#xff0c;似乎真的比兩步法要好很多。 代碼如下&#xff1a; clear all; c…

pc微信不支持flash_在出售PC之前,如何取消對Flash內容的授權

pc微信不支持flashWhen it comes to selling your old digital equipment you usually should wipe it of all digital traces with something like DBAN, however if you can’t there are some precautions you should take–here’s one related to Flash content you may h…