StreamTokenizer
类接受一个输入流并将其解析为“标记”,允许逐个读取这些标记。解析过程由一个表和一些可以设置为不同状态的标志控制。流标记器可以识别标识符、数字、带引号的字符串和各种注释样式。
从输入流中读取的每个字节被视为范围在'\u0000'
到'\u00FF'
之间的字符。字符值用于查找字符的五个可能属性:空白字符、字母、数字、字符串引号和注释字符。每个字符可以具有零个或多个这些属性。
此外,一个实例有四个标志。这些标志指示:
- 是否将行终止符作为标记返回,还是将其视为仅分隔标记的空白字符。
- 是否识别并跳过C风格注释。
- 是否识别并跳过C++风格注释。
- 是否将标识符的字符转换为小写。
一个典型的应用程序首先构造此类的一个实例,设置语法表,然后在循环的每次迭代中重复调用nextToken
方法,直到它返回值TT_EOF
。
- 自从:
- 1.0
- 另请参阅:
-
Field Summary
Modifier and TypeFieldDescriptiondouble
如果当前标记是一个数字,则此字段包含该数字的值。如果当前标记是一个单词标记,则此字段包含一个字符串,其中包含单词标记的字符。static final int
表示已读取流的末尾的常量。static final int
表示已读取行的末尾的常量。static final int
表示已读取数字标记的常量。static final int
表示已读取单词标记的常量。int
在调用nextToken
方法后,此字段包含刚读取的标记的类型。 -
Constructor Summary
ConstructorDescription已弃用。从JDK版本1.1开始,将输入流标记化的首选方法是将其转换为字符流,例如:创建一个解析给定字符流的标记生成器。 -
Method Summary
Modifier and TypeMethodDescriptionvoid
commentChar
(int ch) 指定字符参数开始一个单行注释。void
eolIsSignificant
(boolean flag) 确定是否将行尾视为标记。int
lineno()
返回当前行号。void
lowerCaseMode
(boolean fl) 确定是否自动将单词标记转换为小写。int
从此标记生成器的输入流中解析下一个标记。void
ordinaryChar
(int ch) 指定此标记生成器中的字符参数为“普通”。void
ordinaryChars
(int low, int hi) 指定范围在low <= c <= high
内的所有字符为此标记生成器中的“普通”字符。void
指定应由此标记生成器解析数字。void
pushBack()
导致此标记生成器的下一次调用nextToken
方法返回ttype
字段中的当前值,并且不修改nval
或sval
字段中的值。void
quoteChar
(int ch) 指定此字符在此标记生成器中匹配的字符对界定字符串常量。void
重置此标记生成器的语法表,以使所有字符均为“普通”。void
slashSlashComments
(boolean flag) 确定标记生成器是否识别C++风格注释。void
slashStarComments
(boolean flag) 确定标记生成器是否识别C风格注释。toString()
返回当前流标记的字符串表示形式及其出现的行号。void
whitespaceChars
(int low, int hi) 指定范围在low <= c <= high
内的所有字符为空白字符。void
wordChars
(int low, int hi) 指定范围在low <= c <= high
内的所有字符为单词组成字符。
-
Field Details
-
ttype
public int ttype在调用nextToken
方法后,此字段包含刚读取的标记的类型。对于单个字符标记,其值为转换为整数的单个字符。对于带引号的字符串标记,其值为引号字符。否则,其值为以下之一:TT_WORD
表示标记是一个单词。TT_NUMBER
表示标记是一个数字。TT_EOL
表示已读取行的末尾。只有在调用eolIsSignificant
方法并传入true
参数时,该字段才能具有此值。TT_EOF
表示已到达输入流的末尾。
此字段的初始值为-4。
- 另请参阅:
-
TT_EOF
public static final int TT_EOF表示已读取流的末尾的常量。- 另请参阅:
-
TT_EOL
public static final int TT_EOL表示已读取行的末尾的常量。- 另请参阅:
-
TT_NUMBER
public static final int TT_NUMBER表示已读取数字标记的常量。- 另请参阅:
-
TT_WORD
public static final int TT_WORD表示已读取单词标记的常量。- 另请参阅:
-
sval
如果当前标记是一个单词标记,则此字段包含一个字符串,其中包含单词标记的字符。当当前标记是带引号的字符串标记时,此字段包含字符串的内容。当
ttype
字段的值为TT_WORD
时,当前标记是一个单词。当ttype
字段的值是引号字符时,当前标记是一个带引号的字符串标记。此字段的初始值为null。
- 另请参阅:
-
nval
public double nval如果当前标记是一个数字,则此字段包含该数字的值。当ttype
字段的值为TT_NUMBER
时,当前标记是一个数字。此字段的初始值为0.0。
- 另请参阅:
-
-
Constructor Details
-
StreamTokenizer
Deprecated.As of JDK version 1.1, the preferred way to tokenize an input stream is to convert it into a character stream, for example:Reader r = new BufferedReader(new InputStreamReader(is)); StreamTokenizer st = new StreamTokenizer(r);
创建一个解析指定输入流的标记生成器。标记生成器初始化为以下默认状态:- 所有字节值
'A'
到'Z'
,'a'
到'z'
,以及'\u00A0'
到'\u00FF'
被视为字母。 - 所有字节值
'\u0000'
到'\u0020'
被视为空白字符。 '/'
是注释字符。- 单引号
'\''
和双引号'"'
是字符串引号字符。 - 数字被解析。
- 行尾被视为空白字符,而不是单独的标记。
- 不识别C风格和C++风格注释。
- 参数:
-
is
- 一个输入流。 - 另请参阅:
- 所有字节值
-
StreamTokenizer
创建一个解析给定字符流的标记生成器。- 参数:
-
r
- 提供输入流的Reader对象。 - 自从:
- 1.1
-
-
Method Details
-
resetSyntax
public void resetSyntax()重置此标记生成器的语法表,以使所有字符均为“普通”。有关字符为普通字符的更多信息,请参阅ordinaryChar
方法。- 另请参阅:
-
wordChars
public void wordChars(int low, int hi) 指定范围在low <= c <= high
内的所有字符为单词组成字符。单词标记由单词组成字符后跟零个或多个单词组成字符或数字组成字符组成。- 参数:
-
low
- 范围的低端。 -
hi
- 范围的高端。
-
whitespaceChars
public void whitespaceChars(int low, int hi) 指定范围在low <= c <= high
内的所有字符为空白字符。空白字符仅用于分隔输入流中的标记。指定范围内字符的任何其他属性设置都将被清除。
- 参数:
-
low
- 范围的低端。 -
hi
- 范围的高端。
-
ordinaryChars
public void ordinaryChars(int low, int hi) 指定范围在low <= c <= high
内的所有字符在此标记生成器中为“普通”。有关字符为普通字符的更多信息,请参阅ordinaryChar
方法。- 参数:
-
low
- 范围的低端。 -
hi
- 范围的高端。 - 参见:
-
ordinaryChar
public void ordinaryChar(int ch) 指定字符参数在此标记生成器中为“普通”字符。它会移除字符作为注释字符、单词组件、字符串定界符、空白或数字字符的任何特殊含义。当解析器遇到这样的字符时,解析器将其视为单字符标记,并将ttype
字段设置为字符值。将行终止符字符“普通化”可能会影响
StreamTokenizer
计算行数的能力。lineno
方法可能不再反映其行计数中存在这种终止符字符。- 参数:
-
ch
- 字符。 - 参见:
-
commentChar
public void commentChar(int ch) 指定字符参数开始单行注释。从注释字符到行尾的所有字符都会被此流标记生成器忽略。指定字符的任何其他属性设置都将被清除。
- 参数:
-
ch
- 字符。
-
quoteChar
public void quoteChar(int ch) 指定此字符的匹配对用于定界此标记生成器中的字符串常量。当
nextToken
方法遇到字符串常量时,ttype
字段设置为字符串定界符,sval
字段设置为字符串的内容。如果遇到字符串引号字符,则会识别一个字符串,由字符串引号字符之后(但不包括)的所有字符组成,直到下一个出现该相同字符串引号字符、行终止符或文件结束为止。在解析字符串时,通常的转义序列如
"\n"
和"\t"
会被识别并转换为单个字符。指定字符的任何其他属性设置都将被清除。
- 参数:
-
ch
- 字符。 - 参见:
-
parseNumbers
public void parseNumbers()指定此标记生成器应解析数字。此标记生成器的语法表将被修改,以便十二个字符中的每个字符:0 1 2 3 4 5 6 7 8 9 . -
具有“数字”属性。
当解析器遇到格式为双精度浮点数的单词标记时,它将该标记视为数字而不是单词,通过将
ttype
字段设置为值TT_NUMBER
并将标记的数值放入nval
字段。- 参见:
-
eolIsSignificant
public void eolIsSignificant(boolean flag) 确定是否将行尾视为标记。如果标志参数为true,则此标记生成器将行尾视为标记;当读取行尾时,nextToken
方法返回TT_EOL
,并且还将ttype
字段设置为此值。行是以回车符字符(
'\r'
)或换行符字符('\n'
)结尾的字符序列。此外,紧随回车符字符后面的换行符字符被视为单个行终止符。如果
flag
为false,则行尾字符被视为空白字符,仅用于分隔标记。- 参数:
-
flag
-true
表示行尾字符是单独的标记;false
表示行尾字符是空白字符。 - 参见:
-
slashStarComments
public void slashStarComments(boolean flag) 确定标记生成器是否识别C风格注释。如果标志参数为true
,则此流标记生成器将识别C风格注释。在/*
和*/
之间的所有文本都将被丢弃。如果标志参数为
false
,则C风格注释不会被特殊处理。- 参数:
-
flag
-true
表示识别并忽略C风格注释。
-
slashSlashComments
public void slashSlashComments(boolean flag) 确定标记生成器是否识别C++风格注释。如果标志参数为true
,则此流标记生成器将识别C++风格注释。任何两个连续斜杠字符('/'
)的出现都被视为从开始的注释延伸到行尾。如果标志参数为
false
,则C++风格注释不会被特殊处理。- 参数:
-
flag
-true
表示识别并忽略C++风格注释。
-
lowerCaseMode
public void lowerCaseMode(boolean fl) 确定是否自动将单词标记转换为小写。如果标志参数为true
,则每当返回单词标记时,sval
字段中的值将被转换为小写(通过此标记生成器的nextToken
方法将ttype
字段的值为TT_WORD
)。如果标志参数为
false
,则sval
字段不会被修改。- 参数:
-
fl
-true
表示所有单词标记应转换为小写。 - 参见:
-
nextToken
从此标记生成器的输入流中解析下一个标记。下一个标记的类型将在ttype
字段中返回。有关标记的其他信息可能在此标记生成器的nval
字段或sval
字段中。此类的典型客户端首先设置语法表,然后循环调用nextToken来解析连续的标记,直到返回TT_EOF。
- 返回:
-
ttype
字段的值。 - 抛出:
-
IOException
- 如果发生I/O错误。 - 参见:
-
pushBack
public void pushBack()导致此标记生成器的nextToken
方法的下一次调用返回ttype
字段中的当前值,并且不修改nval
或sval
字段中的值。- 参见:
-
lineno
public int lineno()返回当前行号。- 返回:
- 此流标记生成器的当前行号。
-
toString
返回当前流标记的字符串表示形式及其出现的行号。返回的确切字符串未指定,尽管以下示例可被视为典型:
Token['a'], line 10
-