目录

一、StreamTokenizer中的基本方法

二、StreamTokenizer的构造方法

2.1 指定单词要素

2.2 指定分隔符

三、算法题用法

3.1 普通用法

3.2 多组输入


一、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();
}

我们要注意区分whitespaceCharsquoteChar,他们两个都是指定分隔符,但是他们两个指定的分隔符是有区别的,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 (就是!-@, 可以简单的记为小键盘的12

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();
    }
}

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐