1.1.3.2.8 分解
分解 是指將字節(jié)或字符序列分割為像單詞這樣的邏輯塊的過(guò)程。Java 提供StreamTokenizer 類, 像下面這樣操作:
import java.io.*;
public class token1 {
public static void main(String args[]) {
if (args.length != 1) {
System.err.println("missing filename");
System.exit(1);
}
try {
FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
StreamTokenizer st = new StreamTokenizer(br);
st.resetSyntax();
st.wordChars('a', 'z');
int tok;
while ((tok = st.nextToken()) != StreamTokenizer.TT_EOF) {
if (tok == StreamTokenizer.TT_WORD)
;// st.sval has token
}
br.close();
} catch (IOException e) {
System.err.println(e);
}
}
}
這個(gè)例子分解小寫(xiě)單詞 (字母a-z)。如果你自己實(shí)現(xiàn)同等地功能,它可能像這樣:
import java.io.*;
public class token2 {
public static void main(String args[]) {
if (args.length != 1) {
System.err.println("missing filename");
System.exit(1);
}
try {
FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
int maxlen = 256;
int currlen = 0;
char wordbuf[] = new char[maxlen];
int c;
do {
c = br.read();
if (c >= 'a' && c <= 'z') {
if (currlen == maxlen) {
maxlen *= 1.5;
char xbuf[] = new char[maxlen];
System.arraycopy(wordbuf, 0, xbuf, 0, currlen);
wordbuf = xbuf;
}
wordbuf[currlen++] = (char) c;
} else if (currlen > 0) {
String s = new String(wordbuf, 0, currlen); // do something
// with s
currlen = 0;
}
} while (c != -1);
br.close();
} catch (IOException e) {
System.err.println(e);
}
}
}
第二個(gè)程序比前一個(gè)運(yùn)行快大約 20%,代價(jià)是寫(xiě)一些微妙的底層代碼。
StreamTokenizer 是一種混合類,它從字符流(例如 BufferedReader)讀取, 但是同時(shí)以字節(jié)的形式操作,將所有的字符當(dāng)作雙字節(jié)(大于 0xff) ,即使它們是字母字符。
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |