FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Java »【Java】StreamTokenizer を使ってみる

【Java】StreamTokenizer を使ってみる  


 元々このシリーズにはメッセージウィンドウのようなものを作ってあるんだけど、現在の所、単一メッセージなんだよね。複数ページには対応してない。でもこの機能を利用してアドベンチャーパートみたいに、クリックしてメッセージが次々切り替わるのも作ってみようかと検討中。

 でもそうなると、テキスト解析機能が必要なんだよね。実はメッセージウィンドウにも特殊なタグ(ハートとか汗記号とか)を表示するために、簡単なパーサー機能を付けてあるんだけど、アドベンチャーゲームはこれの多機能版とも言える。

 そこで手軽に作れるものはないかと探してみたら、StreamTokenizer というものを発見。で、さっそくテスト。

final static char SINGLE_QUOTE = '\'';
final static char DOUBLE_QUOTE = '"';

public void readTokenTest(String fileName) {
File file = new File(fileName);

FileReader fr = null;
try {
fr = new FileReader(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
return;
}

BufferedReader br = new BufferedReader(fr);

StreamTokenizer st = new StreamTokenizer(br);
st.eolIsSignificant(false); //行の終わりを空白として扱う
st.commentChar('#'); //"#"をコメント行にする
st.slashSlashComments(true); //"//"をコメント行にする
st.slashStarComments(true); //"/* ~ */"をコメント行にする
st.lowerCaseMode(true); //トークンを自動的に小文字に変換
st.parseNumbers(); //数字を解析する
st.quoteChar(SINGLE_QUOTE); //"'"を文字列リテラル引用符とする
st.quoteChar(DOUBLE_QUOTE); //'"'を文字列リテラル引用符とする

try {
while (st.nextToken() != StreamTokenizer.TT_EOF) {
switch (st.ttype) {
case StreamTokenizer.TT_WORD:
System.out.println(st.lineno() + ":(sval) = " + st.sval);
break;

case StreamTokenizer.TT_NUMBER:
System.out.println(st.lineno() + ":(nval) = " + st.nval);
break;

case DOUBLE_QUOTE:
System.out.println(st.lineno() + ":(d-quot) = " + st.sval);
break;

case SINGLE_QUOTE:
System.out.println(st.lineno() + ":(s-quot) = " + st.sval);
break;

default:
System.out.println(st.lineno() + ":(char) = " + (char)st.ttype);
break;
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}

//メインでは
String fileName = "C:/test/sample.txt"; //トークン解析するファイル(任意)
readTokenTest(fileName);

 実行すると StreamTokenizer でのトークン分割が行われる。行と型(主に文字か数字)で分けられるが、それ以外は記号扱いかな。

 う~ん、まあまあかな・・・。クォートした文字列が簡単に取り出せるのはいいが、コメント行は"#"以降コメントなので、途中にあるときは以降もコメント化か・・・。先頭だけというもの使いたいな。あとクォートされた数字は文字列になるので、変換が必要だな。数字認識も Double 型で返される。開始タグと終了タグも記号で分析する必要があるな。行は lineno() で取れるが、何文字目かはわからない。

 ちなみに Android で assets/ フォルダから読み込んで StreamTokenizer 使うには、File の部分を AssetManager でのストリームオープンに置き換えれば良い。

public void readTokenTest(String fileName) {
AssetManager assetManager = getContext().getAssets();

InputStream is = null;
try {
is = assetManager.open(fileName);
} catch (IOException e) {
e.printStackTrace();
return;
}

BufferedReader br = new BufferedReader(new InputStreamReader(is));

StreamTokenizer st = new StreamTokenizer(br);
//・・・以下は同じ。長いので省略・・・
}

//メインのファイル名引数は assets/ 以下のパス名(この場合、assets/test/ 以下ファイル)
String fileName = "test/sample.txt"; //トークン解析するファイル(任意)
readTokenTest(fileName);

 これはこれで使いこなすのは骨が折れるかな。やっぱり自分でパーサー作った方が良さそう。まぁ、アドベンチャーすべての機能を付け加えるのは大変なので、背景とキャラ表示、セリフの表示と表情など変化だけでも十分だしね。結局これも自作するしかないかな(笑)。


※イラスト:こばP さん
※キャラクター画像は「著作権フリー立ちキャラクター素材集」を使用しています。


(関連記事)
【Android】assets フォルダからテキストファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ


関連記事
スポンサーサイト



category: Java

thread: プログラミング

janre: コンピュータ

tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/95-8a078ddb
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR