1. 程式人生 > >(第二次作業)運用Java統計字符數、單詞數、行數

(第二次作業)運用Java統計字符數、單詞數、行數

jdk下載 函數 單詞 load asn lac 二次 htm ref

---恢復內容開始---

Gitee項目地址:項目地址

https://gitee.com/ZK154/WordCount.git

1.解題思路

首先,當我讀完作業要求後,我有了一個大概的思路。 這是一個IO流的問題,有文件的讀與寫,有以下幾點需要註意:

  •  判斷關鍵輸入符是否存在(-c , -w ,-l , -o)。
  • 判斷讀入文件是否存在 。
  • 判斷控制臺輸入格式是否正確 。
  • 對文件內容要用正則表達式篩選。

這幾點分開看並不難,但是合起來必要亂。對文件中其他字符、字母的查找、漢字的去除要用到正則表達式,因為要求生成.exe可執行文件,所以我選擇java編程

  

2.準備工作

  •  下載Myeclipse / eclipse / Sublime Text3 任選一樣
  •  下載JDK , java編程的核心 。 JDK下載地址
  • 下載exe4j 用於生成exe文件 。 exe4j下載

3.實現編碼

  為了實現功能,我寫了6個靜態函數:

int  linewNum(String fileName) 
           //接受文件名,返回行數,   int wordNum(String fileName )          //接受文件名 ,返回單詞數, int characterNum(String fileName )         //接受文件名,返回字符數,     void writeFile(String targetFile, String save)   //接受目標文件與要保存的數據 void writeResult(String string)              //接受保存的數據,保存進默認的result.txt文件 String selectC(String[] str, String target)
          //查詢.c文件名,並返回

說明:

控制臺輸入進來的就是一個字符串,例如“wc.exe -w test.c ”,我們想要獲得要查詢得文件名“test.c”就要對字符串進行分割 java裏Object.split( )可以實現,返回一個數組。同理 “-w”,"-c","-l","-o"這些關鍵字也可以獲得,這樣根據這些字符就可以進行功能的實現。

4.具體代碼

實現對字符的統計

按字節讀取先存入char數組裏,再進行統計,註意:回車包含兩個符號"\r\n"

技術分享圖片
 1 public static int characterNum(String fileName) throws IOException {
 2         File file = new File(fileName);
 3         int x = 0;
 4         if (file.exists()) {
 5             String path = file.getAbsolutePath();// 得到exe的文件路徑
 6             FileReader fr = new FileReader(path);
 7             BufferedReader br = new BufferedReader(fr);
 8             String str;
 9             char[] ch = new char[300000];
10             int len = 0;
11 
12             while ((len = br.read(ch)) != -1) {
13                 x = len;
14                 // System.out.println(ch[len]);
15             }
16             fr.close();
17             br.close();
18             System.out.println("字符數:" + x);
19             writeResult("字符數:" + x + "\r\n");
20             if (!(x != 0)) {
21                 x = x + 1;
22             }
23         }
24 
25         return x;
26     }
characterNum

實現對單詞的統計

題目要求"," 和" "分格的算單詞,先用正則表達式過濾漢字,再將"," 替換成空格,這樣就能分清哪些是單詞,在用split按空格分割,單詞就出來了

技術分享圖片
 1     // 單詞數
 2     public static int wordNum(String fileName) throws IOException {
 3         File file = new File(fileName);
 4         int total = 0;
 5         if (file.exists()) {
 6             String path = file.getAbsolutePath();// 得到exe的文件路徑
 7             FileReader fr = new FileReader(path);
 8             BufferedReader br = new BufferedReader(fr);
 9             String str;
10             int line = 0;
11             ArrayList array = new ArrayList();
12             while ((str = br.readLine()) != null) {
13                 str = str.replaceAll("[(\\u4e00-\\u9fa5)]", "");// 去除漢字
14                 str = str.replaceAll(",", " "); // 去除空格
15                 String[] str1 = str.split("\\s+"); // 按空格分割
16                 array.add(str1); // 放入集合
17                 line++;
18             }
19             fr.close();
20             br.close();
21 
22             String regex = ".*[a-zA-Z]+.*"; // 正則判斷每個數組中是否存在有效單詞(存在字母)
23             Pattern p = Pattern.compile(regex);
24             Iterator it = array.iterator();
25             while (it.hasNext()) {
26                 String[] string = (String[]) it.next();
27                 for (int y = 0; y <= string.length - 1; y++) {
28                     Matcher m = p.matcher(string[y]);
29                     if (m.matches()) {
30                         total++; // 每存在一個total加1
31                     }
32                 }
33             }
34             System.out.println("單詞數:" + total);
35             writeResult("單詞數:" + total + "\r\n");
36             if (!(total != 0)) {
37                 total = total + 1;
38             }
39         }
40 
41         return total;
42     }
wordNum

實現對行數的統計

java File類自帶函數readline可以按行讀取,定義一個int形變量 ,每讀一行則加一

技術分享圖片
 1     // 行數
 2     public static int lineNum(String fileName) throws IOException {
 3         File file = new File(fileName);
 4         int line = 0;
 5         if (file.exists()) {
 6             String path = new File(fileName).getAbsolutePath();// 得到exe的文件路徑
 7             FileReader fr = new FileReader(path);
 8             BufferedReader br = new BufferedReader(fr);
 9             while (br.readLine() != null) { // 按行讀取,每存在一行line+1
10                 line++;
11             }
12             fr.close();
13             br.close();
14             System.out.println("行數:" + line);
15             writeResult("行數:" + line + "\r\n");
16             if (!(line != 0)) {
17                 line = line + 1;
18             }
19         }
20 
21         return line;
22     }
lineNum

實現對默認result.txt的寫入

現獲取result.txt的地址,沒有的話java裏的FileWrite自動生成result.txt文件

技術分享圖片
 1 // 自動寫入result.txt文件中
 2     public static void writeResult(String string) throws IOException {
 3 
 4         String path = new File("result.txt").getAbsolutePath();
 5         FileWriter fw = new FileWriter(path, true);
 6         fw.write(string);
 7         if (fw != null) {
 8             fw.close();
 9         }
10     }
writeResult

實現對指定文本的寫入

接受目標文件名,並獲得路徑,,創建出的filewrite對象使用write( )方法存入接受的信息字符串

技術分享圖片
 1 // 寫進指定文件
 2     public static void writeFile(String targetFile, String save) throws IOException {
 3 
 4         String path = new File(targetFile).getAbsolutePath(); // 得到目標文件路徑
 5         FileWriter fw = new FileWriter(path, true);
 6         fw.write(save);
 7         if (fw != null) {
 8             fw.close();
 9             System.out.println("存儲成功!");
10         }
11 
12     }
writeFile

4.代碼測試

  測試文件“test.c”,寫入文件output.txt,默認的result.txt與wc.exe都在同一目錄下。

測試對行數、字符數、單詞數單獨查詢

技術分享圖片

測試關鍵字符的聯合查詢,因為是添加模式,result.txt裏信息沒有被覆蓋

技術分享圖片

測試對指定文件的寫入(-o)

技術分享圖片

測試代碼能否辨別錯誤:

技術分享圖片

5.單元測試

  將程序中最小的模塊拿出來進行測試,

5.1對characterNum測試:結果正確無誤

技術分享圖片

5.2 對wordNum進行測試:符合結果通過

技術分享圖片

5.3 對lineNum函數進行測試:

技術分享圖片

5.4 對writeFile函數的測試:

技術分享圖片

5.5 對writeResult函數的測試:

技術分享圖片

測試結果:各函數在單獨執行下都能完成功能

6.參考資料

1. 如何將jar打包成exe文件

2.Java io流最詳細講解

3.JAVA String類常用方法詳解

4. 關於Java的單元測試

---恢復內容結束---

(第二次作業)運用Java統計字符數、單詞數、行數