java StreamTokenizer wordChars() 和 nextToken()

标签 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('_','_') 是否意味着只有下划线才会被视为有效单词?

在这种情况下, token 是什么?

非常感谢。

最佳答案

StreamTokenizer 如何分隔输入流。是否由空格和下一行分隔?

简短的回答是

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

text.wordChars('_','_') 是否意味着只有下划线才会被视为有效单词?

简短的回答是

WordChars 需要两个输入。 First(low) 是字符集的下限,second(high) 是字符集的上限。如果 low 传递的值小于 0,那么它将被设置为 0。由于您传递的是 _ = 95,因此下限将被接受为 _=95。如果传递的 high 小于 255,则它被接受为字符集范围的高端。由于您通过了 _=95,这也被接受。现在,当它尝试确定从 low-to-high 的字符范围时,它只找到一个字符,即 _ 本身。在这种情况下,_ 将是唯一被识别为单词字符的字符。

关于java StreamTokenizer wordChars() 和 nextToken(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105873/

相关文章:

java - 如何减少 JSF 中的 javax.faces.ViewState

java - 在Java中打印包含特定模式的字符串

java - 如何搜索工作资料联系人

java - 使用子集 - 成对差异(数组)

java - 无法将 JSON 反序列化为 POJO(使用 Jackson)

java - 数组列表算法——面试

java - Java 中是否存在未处理的异常处理程序?

Java FX 仅在事件处理程序完成时更新 GUI

java - 从 open jdk 切换到 Sun jdk

java - mysql 查询字符串中不支持的字符