【Java】StreamTokenizer を使ってみる 
2013/12/22 Sun [edit]
元々このシリーズにはメッセージウィンドウのようなものを作ってあるんだけど、現在の所、単一メッセージなんだよね。複数ページには対応してない。でもこの機能を利用してアドベンチャーパートみたいに、クリックしてメッセージが次々切り替わるのも作ってみようかと検討中。
でもそうなると、テキスト解析機能が必要なんだよね。実はメッセージウィンドウにも特殊なタグ(ハートとか汗記号とか)を表示するために、簡単なパーサー機能を付けてあるんだけど、アドベンチャーゲームはこれの多機能版とも言える。
そこで手軽に作れるものはないかと探してみたら、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】テキストファイルの読み込み・保存 まとめ
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/95-8a078ddb
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |