十三、使用StreamTokenizer統計檔案的字元數
實現檔案中字元數統計的關鍵技術點如下:
1、類java.io.StreamTokenizer可以擷取輸入資料流並將其分析為Token(標記)。StreamTokenizer的nextToken方法讀取下一個標記
2、預設情況下,StreamTokenizer認為下列內容是Token:字母、數字、除c和c++注釋符號以外的其他符號。如符號“/”不是Token,注釋後的內容也不是,而"/"是Token。單引號和雙引號以及其總的內容,只能算一個Token。
3、要統計檔案的字元數,不能簡單的統計Token數,因為字元不等於Token,按照Token的規定,引號中的內容就算是10頁也算一個Token。如果希望引號中的內容都算作Token,應該通過StreamTokenizer的ordinarryCha方法將單引號和雙引號當作一般字元處理。
執行個體示範
package book.io;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.StreamTokenizer;
/** */ /**
* 使用StreamTokenizer來統計檔案中的字元數
* @author joe
*
*/
public class StatisFileChars ... {
/** *//**
* 統計字元數
* @param fileName 檔案名稱
* @return 字元數
*/
public static long statis(String fileName) ...{
FileReader fileReader = null;
try ...{
fileReader = new FileReader(fileName);
//建立分析給定字元流的標記產生器
StreamTokenizer st = new StreamTokenizer(new BufferedReader(fileReader));
//ordinaryChar方法制定字元參數在此標記產生器中是“普通”字元。
//下面制定單引號,雙引號和注釋符號是一般字元
st.ordinaryChar(''');
st.ordinaryChar('"');
st.ordinaryChar('/');
String s;
int numberSum = 0;
int wordSum = 0;
int symbolSum = 0;
int total = 0;
//nextToken方法讀取下一個Token
//TT_EOF指示已讀到流末尾的常量
while (st.nextToken() != StreamTokenizer.TT_EOF) ...{
//在調用nextToken方法之後,ttype欄位將包含剛讀取的標記的類型
switch (st.ttype) ...{
//TT_EOL指示已讀到行末尾的常量
case StreamTokenizer.TT_EOL :
break;
case StreamTokenizer.TT_NUMBER : //TT_NUMBER指示已讀到一個數字標記的常量
//如果當前標記是一個數字標記,nval欄位將包含該數位值
s = String.valueOf((st.nval));
numberSum += s.length();
break;
case StreamTokenizer.TT_WORD : //TT_WORD指示已讀到一個文字標記
//如果當前標記是一個文字標記,sval欄位包含一個給出該文字標記的字元的字串
s = st.sval;
wordSum += s.length();
break;
default:
//如果以上3中類型都不是,則為英文的標點符號
s = String.valueOf((char) st.ttype);
symbolSum += s.length();
}
}
System.out.println("sum of number = " + numberSum);
System.out.println("sum of word = " + wordSum);
System.out.println("sum of symbol =