一、StreamTokenizer概述
Java中的StreamTokenizer类是用于解析输入流的一个强大工具,可以按照不同的标记对输入进行解析,并将其分类。
StreamTokenizer用于将字节流转换为字符流并对其进行分词,可以识别各种类型的标记,如字符串、整数和浮点数。
StreamTokenizer是一种高效的解析工具,适用于解析文本文件、配置文件等一般应用场景。它比Scanner类更加高效,因为它不需要进行正则表达式的匹配。
二、StreamTokenizer主要方法
1.nextToken()
nextToken()方法用来获取下一个标记,它返回一个整型值,表示下一个标记的类型,常见的标记类型包括:
- TT_EOF:表示已到达输入流的末尾
- TT_NUMBER:表示下一个标记是一个数字,可以使用nval属性来获取该数字的值
- TT_WORD:表示下一个标记是一个字符串,可以使用sval属性来获取该字符串的值
- 单个字符表示该字符的ASCII码值
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else {
System.out.println("Char: " + (char) tokenizer.ttype);
}
}
2.parseNumbers(boolean flag)
parseNumbers()方法用来设置tokenizer是否要解析数字,默认情况下是不解析数字的。
如果flag为true,则tokenizer会将所有数字作为标记来处理。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
tokenizer.parseNumbers(true);
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else {
System.out.println("Char: " + (char) tokenizer.ttype);
}
}
3.eolIsSignificant(boolean flag)
eolIsSignificant()方法用来设置tokenizer是否将行结束符作为标记,如果flag为true,则行结束符会被视为单独的标记,而不是字符串的一部分。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
tokenizer.eolIsSignificant(true);
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else if (tokenizer.ttype == StreamTokenizer.TT_EOL) {
System.out.println("End of line");
} else {
System.out.println("Char: " + (char) tokenizer.ttype);
}
}
4.quoteChar(int ch)
quoteChar()方法用来设置tokenizer识别某个字符作为引号。当tokenizer遇到被设置的引号时,它会将引号内的所有字符作为一个标记。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.txt"));
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else {
System.out.println("Char: " + (char) tokenizer.ttype);
}
}
三、StreamTokenizer应用场景
1.解析CSV文件
CSV文件是一种常见的表格数据存储格式,它使用逗号分隔列数据,并使用回车换行符作为行分隔符。
StreamTokenizer可以轻松解析CSV文件,并将每一列数据作为一个标记返回。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.csv"));
tokenizer.eolIsSignificant(true);
tokenizer.wordChars(',', ',');
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("Number: " + tokenizer.nval);
} else if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println("String: " + tokenizer.sval);
} else if (tokenizer.ttype == StreamTokenizer.TT_EOL) {
System.out.println("End of line");
}
}
2.解析INI文件
INI文件是一种常见的配置文件格式,它使用键值对的方式存储数据。
StreamTokenizer可以轻松解析INI文件,并将每个键值对作为一个标记返回。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.ini"));
tokenizer.wordChars('_', '_');
tokenizer.wordChars('-', '-');
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
String key = tokenizer.sval;
tokenizer.nextToken();
if (tokenizer.ttype == '=') {
tokenizer.nextToken();
String value = tokenizer.sval;
System.out.println(key + " = " + value);
}
}
}
3.解析XML文件
XML文件是一种常见的标记语言,用于描述和存储数据。
StreamTokenizer可以简单地解析XML文件,并将每个标记作为一个标记返回,并且可以使用递归函数进行解析内部元素。
StreamTokenizer tokenizer = new StreamTokenizer(new FileReader("example.xml"));
tokenizer.wordChars(':', ':');
tokenizer.wordChars('_', '_');
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
String tag = tokenizer.sval;
System.out.println("");
if (tokenizer.nextToken() != StreamTokenizer.TT_EOF && tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println(tokenizer.sval);
}
if (tokenizer.nextToken() != StreamTokenizer.TT_EOF && tokenizer.ttype == '/') {
System.out.println("" + tag + ">");
} else {
tokenizer.pushBack();
parseXMLElement(tokenizer);
}
}
}
public static void parseXMLElement(StreamTokenizer tokenizer) throws IOException {
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_WORD) {
String attribute = tokenizer.sval;
tokenizer.nextToken();
String value = tokenizer.sval;
System.out.println(attribute + " = " + value);
} else if (tokenizer.ttype == StreamTokenizer.TT_SLASH) {
break;
}
}
}
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/304215.html
微信扫一扫
支付宝扫一扫