java-streamtokenizer
StreamTokenizerのガイド
1. 前書き
このチュートリアルでは、Java _StreamTokenizer_クラスを使用して、文字のストリームをトークンに解析する方法を示します。
2. StreamTokenizer
_StreamTokenizer_クラスは、ストリームを1文字ずつ読み取ります。 それらはそれぞれ、空白、英字、数字、文字列引用符、コメント文字などの属性を0個以上持つことができます。*
次に、デフォルト構成を理解する必要があります。 次の種類の文字があります。
-
単語の文字:「a」から「z」、「A」から「Z」などの範囲
-
数字:0、1、…、9
-
Whitespace characters:0から32までのASCII値
-
コメント文字:/
-
String quote characters: ’and“
*行の終わりは個別のトークンとしてではなく、空白として扱われます*。C/ C ++スタイルのコメントはデフォルトでは認識されません。
このクラスには、一連の重要なフィールドがあります。
-
TT_EOF –ストリームの終わりを示す定数
-
TT_EOL –行の終わりを示す定数
-
TT_NUMBER –数値トークンを示す定数
-
TT_WORD –単語トークンを示す定数
3. デフォルト設定
ここでは、_StreamTokenizer_メカニズムを理解するための例を作成します。 私たちは、このクラスのインスタンスを作成することによって開始し、それが_TT_EOF_値を返すまで_nextToken()_メソッドを呼び出します:
private static final int QUOTE_CHARACTER = '\'';
private static final int DOUBLE_QUOTE_CHARACTER = '"';
public static List<Object> streamTokenizerWithDefaultConfiguration(Reader reader) throws IOException {
StreamTokenizer streamTokenizer = new StreamTokenizer(reader);
List<Object> tokens = new ArrayList<Object>();
int currentToken = streamTokenizer.nextToken();
while (currentToken != StreamTokenizer.TT_EOF) {
if (streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) {
tokens.add(streamTokenizer.nval);
} else if (streamTokenizer.ttype == StreamTokenizer.TT_WORD
|| streamTokenizer.ttype == QUOTE_CHARACTER
|| streamTokenizer.ttype == DOUBLE_QUOTE_CHARACTER) {
tokens.add(streamTokenizer.sval);
} else {
tokens.add((char) currentToken);
}
currentToken = streamTokenizer.nextToken();
}
return tokens;
}
テストファイルには次のものが含まれています。
3 quick brown foxes jump over the "lazy" dog!
#test1
//test2
ここで、配列の内容を出力すると、次のように表示されます。
Number: 3.0
Word: quick
Word: brown
Word: foxes
Word: jump
Word: over
Word: the
Word: lazy
Word: dog
Ordinary char: !
Ordinary char: #
Word: test1
この例をよりよく理解するには、_StreamTokenizer.ttype _、_ StreamTokenizer.nval_、および_StreamTokenizer.sval_フィールドについて説明する必要があります。
-
ttype_フィールドには、読み取ったばかりのトークンのタイプが含まれます。* _TT_EOF _、 TT_EOL 、 TT_NUMBER 、 TT_WORD_の場合があります。 ただし、引用符付き文字列トークンの場合、その値は引用文字のASCII値*です。 さらに、トークンが属性なしの_´! ‘_のような通常の文字である場合、_ttype_にはその文字のASCII値が取り込まれます。
次に、_sval_フィールドを使用してトークンを取得します。これは、_TT_WORD_ *、つまり単語トークンの場合のみです。 ただし、引用符で囲まれた文字列トークン(__lazy–âなど)を処理している場合、このフィールドには文字列の本文が含まれます。
最後に、* _ TT_NUMBER_を使用して、トークンを取得するために_nval_フィールドを使用しました。
4. カスタム構成
ここでは、デフォルトの構成を変更し、別の例を作成します。
最初に、_wordChars(int low、int hi)_ *メソッドを使用して、余分な単語の文字を設定します。 次に、*コメント文字(「/」)を通常の文字*にして、新しいコメント文字として_ ‘#' _を昇格します。
最後に、_eolIsSignificant(boolean flag)_メソッドを使用して、行の終わりをトークン文字と見なします*。
_streamTokenizer_オブジェクトでこれらのメソッドを呼び出すだけです。
public static List<Object> streamTokenizerWithCustomConfiguration(Reader reader) throws IOException {
StreamTokenizer streamTokenizer = new StreamTokenizer(reader);
List<Object> tokens = new ArrayList<Object>();
streamTokenizer.wordChars('!', '-');
streamTokenizer.ordinaryChar('/');
streamTokenizer.commentChar('#');
streamTokenizer.eolIsSignificant(true);
// same as before
return tokens;
}
そして、ここに新しい出力があります:
// same output as earlier
Word: "lazy"
Word: dog!
Ordinary char:
Ordinary char:
Ordinary char: /
Ordinary char: /
Word: test2
二重引用符がトークンの一部になったことに注意してください。改行文字はもはや空白文字ではなく、通常の文字であるため、単一文字のトークンです。
また、「#」文字に続く文字はスキップされ、「/」は通常の文字になりました。
また、_quoteChar(int ch)_メソッドで引用文字を変更することもできますし、_whitespaceChars(int low、int hi)_メソッドを呼び出して空白文字を変更することもできます。 したがって、_StreamTokenizer_’sメソッドをさまざまな組み合わせで呼び出して、さらにカスタマイズすることができます**。**
5. 結論
このチュートリアルでは、* _ StreamTokenizer_クラスを使用して文字のストリームをトークンに解析する方法を見てきました*。 デフォルトのメカニズムについて学び、デフォルトの構成でサンプルを作成しました。
最後に、デフォルトのパラメーターを変更し、_StreamTokenizer_クラスの柔軟性に気付きました。
いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/java-strings-2[GitHub上]にあります。