プログラマメモ2 - programmer no memo2

StreamTokenizerでTT_EOLを取得するには - javadocをみればわかりますが。 2007/08/25

java1.5から導入されたjava.util.Scannerが非常に便利なのですが、System.inから改行を受け取りたい場合、どうも使いづらいことがわかったので、別の方法を模索している最中です。

java.util.Scannerの使い方をちょい研究せねば...

いろいろ調べていて、java.io.StreamTokenizerを使用したことがなかったので試してみました。
このトークナイザーを使えば、簡単なパーサーは楽に作れると思いました。

java.io.StreamTokenizerにはTT_EOLがありました。

行の終わりが読み込まれたことを示す定数です。javadoc1.6


ちなみにこのトークンを受け取るためには、実は、パラメータを設定しないといけません。

javadocには下記のようにあります。

行の終わりをトークンとして処理するかどうかを判別します。flag 引数が true の場合、このトークナイザは行の終わりをトークンとして処理します。行の終わりが読み込まれると、nextToken メソッドは TT_EOL を返し、ttype フィールドにこの値を設定します。

行は、キャリッジリターン文字 ('\r') または改行文字 ('\n') で終わる文字シーケンスです。また、直後に改行文字が続くキャリッジリターン文字は、行末を表す単一のトークンとして扱われます。

flag が false の場合、行末文字は空白として扱われ、その機能はトークンを区切るだけです。
javadoc1.6


これに気がつかず、TT_EOLがとれないことにしばし頭を抱えていました....

以下、参考コードです。

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class Test2 {

public static void main(String[] args) throws IOException {
StreamTokenizer st = new StreamTokenizer(new InputStreamReader(
System.in));
st.eolIsSignificant(true);

while (st.nextToken() != StreamTokenizer.TT_EOF) {
switch (st.ttype) {
case StreamTokenizer.TT_WORD:
System.out.println("Text : " + st.sval);
break;
case StreamTokenizer.TT_NUMBER:
System.out.println("Number: " + st.nval);
break;
case StreamTokenizer.TT_EOL:
System.out.println("EOL: ");
break;
}
}

}

}



ちなみに、人によっては、nextTokenメソッドの返り値を格納して場合がありますが、あまり意味ないです。StringTokenizerのインスタンスには、直で参照できる、ttypeがpubliフィールドとして公開されているからですが、ttpyeの使い方ってjavaオンリーのプログラマは違和感を感じるかもしれませんね。

次に、java.io.StreamTokenizerを利用して標準入力の1行単位で処理を行ってみます。文字列、数字を区別しないようにしみます。

コードはTT_EOLがでてくるまで、StringBuilderに文字をつぎつぎとappendしていき、TT_EOLで出力しています。数字をTT_NUMBERとして処理されてしまうのをふせぐために、ordinaryCharメソッドを使用しています。

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class Test2 {

public static void main(String[] args) throws IOException {
StreamTokenizer st = new StreamTokenizer(new InputStreamReader(
System.in));
st.eolIsSignificant(true);
st.ordinaryChar(' ');
st.ordinaryChar('-');
st.ordinaryChars('0', '9');
StringBuilder builder = new StringBuilder();
while (st.nextToken() != StreamTokenizer.TT_EOF) {

switch (st.ttype) {
case StreamTokenizer.TT_WORD:
builder.append(st.sval);
break;
case StreamTokenizer.TT_EOL:
System.out.println("EOL: " + new String(builder));
builder.setLength(0);
break;
default:
builder.append((char) st.ttype);
break;
}
}

}

}

: