- ベストアンサー
StreamTokenizer()の引数
あるプログラムを組むのに、 reader.readLine()メソッドで入力した文章を StreamTokenizer()を使って分解したいのですが、 引数の型が違うためかうまくいきません。 何かよい方法はないでしょうか? 理由あってStringTokenizerは使えないんです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>どうやってreadLine()メソッドで得た文字列を >渡してやれば良いのかが判らないのです。 最初のアドバイスに書いた通り。。。 >StreamTokenizerは文字列ストリームを分解する為に >使われるのであって文字列そのものは分解できません。 という事です。 文字列を分解するのならばStringTokenizerを使って 下さい(使えないとの事ですが、何故使えないのかが 今1つ理解できませんけど、どうしてもダメなら自作 するしかないです) まず、大きな誤解をしているのはStreamTokenizerは BufferedReaderなどを「機能拡張」する為のもので、 バラバラに使うものではないということです。 BufferedReaderをStreamTokenizerに拡張する行為 は、例えれば普通自動車を改造(部品を流用)して ショベルカーを作るようなものです。 ショベルカーに改造しておいて、それを普通自動車と して使うなんて馬鹿げてますよね?それなら最初から 改造しないで普通自動車のままで使えばいいんです。 ですから、BufferedReaderをStreamTokenizerにし た時点からStreamTokenizerの事だけを考えればいい のであってreadLine()などは忘れてください。 >キーボードからの入力を受け取って >StreamTokenizerで分解したいのです。 これだけの情報ではやりたい事がわかりませんけど、 キーボード入力というのがSystem.inの事でしたら、 InputStreamReader r=new InputStreamReader(System.in); BufferedReader b=new BufferedReader(r); StreamTokenizer t=new StreamTokenizer(b); 以上までが入力ストリームの拡張。 そして、1行入力文字列を分解したいようですので、 StreamTokenizerのeolIsSignificant()メソッドで 改行を文字列に指定します。 t.eolIsSignificant(true); 次に分解したトークンを保持する為の変数として StringBufferインスタンスを作る(今回は「/」を 区切り文字にします) StringBuffer sb=new StringBuffer("/"); そして、改行文字まで(1行)をトークンに分解します while(t.nextToken()!=StreamTokenizer.TT_EOL){ switch(t.ttype){ case StreamTokenizer.TT_WORD:sb.append(t.sval);break; case StreamTokenizer.TT_NUMBER:sb.append(t.nval);break; } sb.append("/"); } これで abc def ghi と標準入力に1行入力したら、sbに /abc/def/ghi/ と値が入ります。
その他の回答 (1)
- takaP-
- ベストアンサー率79% (83/105)
「StreamTokenizer()の引数」ってコンストラクタの 引数ということでしょうか? でしたら、APIリファレンスをお読みになれば分かる と思いますが、Reader及びReaderを継承したクラス ということになります。 reader.readLine()という記述から推測して、reader はBufferedReaderの事だと思いますので。。。 StreamTokenizer st=newStreamTokenizer(reader); でStreamTokenizerのインスタンスを生成できます。 (BufferedReaderはReaderの派生クラス) 推測ですけどsenzin氏はStringTokenizerのように 文字列を分解しようとコンストラクタ引数にString を指定しませんでしたか? StreamTokenizerは文字列ストリームを分解する為に 使われるのであって文字列そのものは分解できません。 それと、StringTokenizerとStreamTokenizerでは 使い方が少し(本当はかなり)違います。 一つ一つ説明するには長いので、グーグルで検索して 見つけたリンクを張っときます。
補足
takaP-さん、早速のアドバイス有り難うございます。 StreamTokenizer st=newStreamTokenizer(reader); でインスタンスを生成するまでは判ったのですが、 それにどうやってreadLine()メソッドで得た文字列を 渡してやれば良いのかが判らないのです。 キーボードからの入力を受け取って StreamTokenizerで分解したいのです。 よい方法がありましたらアドバイスをお願いします。
お礼
takaP-さん 重ね重ね、ありがとうございます。 アドバイスのお陰で解決しました。 どうも有り難うございます。