【Java基础】StreamTokenizer使用详解
目录一、StreamTokenizer中的基本方法二、StreamTokenizer的构造方法2.1 指定单词要素2.2 指定分隔符三、算法题用法3.1 普通用法3.2 多组输入一、StreamTokenizer中的基本方法commenChar(int ch) - 指定某个字符为注释字符,此字符之后直到行结尾都被stream tokenizer忽略。eo...
目录
一、StreamTokenizer中的基本方法
- commenChar(int ch) - 指定某个字符为注释字符,此字符之后直到行结尾都被stream tokenizer忽略。
- eolIsSignificant(boolean flag) - 决定一个行结束符是否被当作一个基本的符号处理,如果是true,则被当作一个基本符号,不当作普通的分隔符,如果是false,则保持原义,即当作普通的分隔符。
- lineno() - 返回当前流所在的行号。
- lowerCaseMode(boolean flag) - 决定是否读取一个单词时是否转变成小写。
- nextToken() - 分析下一个。
- ordinaryChar(int ch) - 指定字符在这个tokenizer中保持原义,即只会把当前字符认为普通的字符,不会有其他的语义。
- ordinaryChars(int low, int hi) - 指定范围内的字符保持语义,同上
- parseNumbers() - 当stream tokenizer遭遇到一个单词为双精度的浮点数时,会把它当作一个数字,而不是一个单词。
- pushBack() - 回退,会引起下一个nextToken方法返回当前值。
- quoteChar(int ch) - 指定当前字符为当前tokenizer中的分隔符,在两个符号之间被当作一个字符串解析。
- resetSyntax() - 重置语法表使所有的字符都被认为是“ordinary”。
- slashSlashComments(boolean flag) - 如果为true,则/*与*/之间的都被认为是注释,反之,不是。
- slashStartComments(boolean flag) - 如果为true,则//之后到行结尾的所有都被认为是注释,反之,不是。
- whitespaceChars(int low, int hi) - 字符low与hi之间的所有字符都被当作为空格符,即被认识为tokenzier的分隔符。
- wordChars(int low, int hi) - 字符low与hi之间的所有字符都被当作为单词的要素。 一个单词是由一个单词要素后面跟着0个或者更多个单词要素或者数字要素。
二、StreamTokenizer的构造方法
了解了上面的这些方法,那么阅读StreamTokenizer源码就很简单了,通过StreamTokenizer
private StreamTokenizer() {
// 将a-z的字符作为一个普通单词要素,即可以正常将这些字符解析
wordChars('a', 'z');
// 将A-Z的字符作为一个普通单词要素,即可以正常将这些字符解析
wordChars('A', 'Z');
// 将ASCII码表中160-255的字符作为一个普通单词要素,即可以正常将这些字符解析。一个单词(String)是通过多个单词要素(char)组成的
wordChars(128 + 32, 255);
// StreamTokenizer默认认为空白符就是分隔符
// 将ASCII码表中0-' '的字符作为空白分隔符,因为StreamTokenizer默认认为空白符就是分隔符,所以这些字符也就变成了分隔符
whitespaceChars(0, ' ');
// 将/字符作为注解符,也就是说当一个token中包括/时,/后面的字符全部不再解析
commentChar('/');
// 指定 " 为分隔符
quoteChar('"');
// 指定 ' 为分隔符
quoteChar('\'');
//当stream tokenizer遭遇到一个单词为双精度的浮点数时,会把它当作一个数字,而不是一个单词。
parseNumbers();
}
我们要注意区分whitespaceChars和quoteChar,他们两个都是指定分隔符,但是他们两个指定的分隔符是有区别的,whitespaceChars指定的分隔符是空白分隔符,我们就可以这样理解:
通过st.whitespaceChars('"', '"'); 指定 " 为空白分隔符,只要是分隔符是 " ,不管有多少个,会把所有的这个"看成是一个分隔符将字符串成功分割
但是使用quoteChar('"'); 系统是不会将多个"看成是一个分隔符的
它只适合单个分隔符的情况
我们一般用StreamTokenizer的时候都这样实例化,这样的StreamTokenizer对象速度是最快的
StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
我们在用StreamTokenizer做算法题的时候主要就用quoteChar和wordChars两个方法
quoteChar:用来设置分隔符
whitespaceChars:用来设置空白分隔符
wordChars:用来设置单词要素
2.1 指定单词要素
StreamTokenizer默认将/作为注解符,/后面的东西都不会被解析。如果想读取/,就可以直接用
st.wordChars('/', '/');
这个方法将/作为一个普通的单词要素,这样/就可以作为一个普通的字符被读取解析了。
如果我不想用空格作为分隔符了,也可以用这个方法,这样我们就可以读入有空的字符串了
st.wordChars(' ', ' ');
2.2 指定分隔符
如果我想设置别的字符作为分隔符,可以使用quoteChar方法来设置
如我想让a作为分隔符
st.quoteChar('a');
但是我们最好还是用
st.whitespaceChars('a', 'a');
这个来设置分割符,原因上面已经写了这里
使用StreamTokenizer时要注意它默认设置是有很多字符不是单词要素的,所以会读取解析不了,如有需要需要自己用wordChars方法手动设置。我们可以简单的理解为StreamTokenizer只能读取26个英文字母、汉字、数字(只是简单的理解,他其实还可以读入别的字符,只是那些字符在算法题中几乎用不到)。其他的符号都是不可以读入的,需要我们自己用wordChars()方法设置。
一般我们就自己设置上这两组就够了
33-64 (就是!-@, 可以简单的记为小键盘的1和2 )
91-96
st.wordChars('33', '64');
st.wordChars('91', '96');
三、算法题用法
3.1 普通用法
StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
st.nextToken(); // 获取下一组标记 默认是按照空格分割的 回车,tab是结束符
int i=(int) st.nval; //st.navl默认解析出的格式是double
st.nextToken();
double j=st.nval;
st.nextToken();
String s=st.sval;
3.2 多组输入
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
//PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int a, b;
while(in.nextToken() != StreamTokenizer.TT_EOF) // 表示读到了文件末尾
{
a = (int)in.nval;
in.nextToken();
b = (int)in.nval;
//out.println(a + b);
System.out.println("a + b = "+(a+b));
}
//out.flush();
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)