開発者ドキュメント

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. 結論

このチュートリアルでは、* _ St​​reamTokenizer_クラスを使用して文字のストリームをトークンに解析する方法を見てきました*。 デフォルトのメカニズムについて学び、デフォルトの構成でサンプルを作成しました。
最後に、デフォルトのパラメーターを変更し、_StreamTokenizer_クラスの柔軟性に気付きました。
いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/java-strings-2[GitHub上]にあります。
モバイルバージョンを終了