java StreamTokenizer wordChars()和nextToken()

时间:2012-10-28 02:23:12

标签: java

这可能是一个愚蠢的问题,但我很难认识到StreamTokenizer如何界定输入流。它是由空间和下一行划分的吗?我也对wordChars()的使用感到困惑。例如:

public static int getSet(String workingDirectory, String filename, List<String> set) {
    int cardinality = 0;
    File file = new File(workingDirectory,filename);
    try {
        BufferedReader in = new BufferedReader(new FileReader(file));
        StreamTokenizer text = new StreamTokenizer(in);
        text.wordChars('_','_');
        text.nextToken();
        while (text.ttype != StreamTokenizer.TT_EOF) {
            set.add(text.sval);
            cardinality++;
//              System.out.println(cardinality + " " + text.sval);
            text.nextToken();
        }
        in.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return cardinality; 
}

如果文本文件包含这样的字符串:A_B_C D_E_F。

text.wordChars('_','_')是否只表示下划线会被视为有效字?

在这种情况下代币会是什么?

非常感谢。

2 个答案:

答案 0 :(得分:1)

how StreamTokenizer delimit input streams. Is it delimited by space and nextline?

简答

解析过程由一个表和一些可以设置为各种状态的标志控制。流标记器可以识别标识符,数字,带引号的字符串和各种注释样式。另外,一个实例有四个标志。其中一个标记表示行终止符是作为标记返回还是作为仅仅分隔标记的空格处理。

Does text.wordChars('_','_') mean only underscore will be considered as valid words?

简答

WordChars需要两个输入。第一个(low)是字符集的下端,第二个(high)是字符集的上端。如果low传递的值小于0,则会将其设置为0。由于您要传递_ = 95,因此较低端将被接受为_=95。如果高于255,则它被接受为字符集范围的高端。由于您正在向_=95传递高位,因此也可以接受。现在,当它尝试确定low-to-high中的字符范围时,它只找到一个字符,即_本身。在这种情况下,_将是唯一被识别为单词字符的字符。

答案 1 :(得分:0)

请检查

Pattern splitRegex = Pattern.compile("_");
String[] tokens = splitRegex.split(stringtobesplitedbydelimeter); 

或者您也可以使用

   String[] tokens = stringtobesplitedbydelimeter.split('_')