【java】BuffeerdReaderのreadメソッドで取得するデータを文字に変換する

rubyやPHPをまだちゃんと心行くまで学んでいないのにもかかわらず、javaにも手を染めてしまいました。

今まで c とかにおいても経験した事がなく、変数の宣言やら関数の定義のお作法やら、最初の障壁がめちゃめちゃ高かったのですが、実際に動いてくれるとやっぱり楽しいもんですね。

今日は、普通の人はやらないと思うんですけど、InputStreamReaderクラスを使ってキーボードで入力した標準入力を1文字づつ処理する、というプログラムを書きました。

で、普通は処理の効率化を図りBufferedReaderでラップするらしいのですが、readLineではなくreadメソッドで1個づつ入力キーを取ろうとして大ハマりしてたのでエントリーでござる。

まぁ、たいていの人はそもそも標準入力の受け取りや外部ファイルの読み込みにおいてはreadLineで処理すると思います。

rubyで書いていた時もまずこういったやり方から学びました。
ところが、会社の先輩に1文字づつwhileで処理する練習問題をいただいたのでした。

「だって、スト2とかの技の入力なんて、readLineみたいな関数ではリアルタイムに処理できないだろ?」

って言われたのですが、、、どういうことだ??
で、早速かいてみた

BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
while ( (String str = br.read()) != 1){
System.out.println(str);
}

で、さっそく怒られる。

 シンボルを見つけられません。
シンボル: 変数 String
場所    : Cal の クラス
while((String = br.read()) != -1 ){
^
エラー 1 個

はぁ?!
readLine()の時と話がちげーじゃねーか。
と思いグーグル先生に質問すると

BufferedReaderのread() は int を返すでござるよ(´∀`)

なんて書いてある。

どういうことだぜ?
と思いつつ、一旦intで定義した変数で受け取ってprintlnしてみると
なぞの数字がポコポコ出てくる。 なぞす。

結局、俺みたいな情弱はこの数字がasciiコードだという事に1時間かかり、
asciiコードで表現されたintをStringに変換できるようにするのに3時間くらかかった。

しかし、まじで今回ばかりはグーグル先生に聞いてもさっぱりヒットしなかったんだけど。。(´;ω;`)

まぁいいや、とりあえず解決した方法だけ残しておきます。
、もっとイケてる方法があるぜっていう方は是非教えていただけると幸いです。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
Integer c = br.read();
byte bt = c.byteValue();
byte[] ascii = new byte[]{bt};
String str = "";
try{
str = new String(ascii, "US-ASCII");
}catch(IOException e){
System.out.println("unrecognize character");
}

というわけで、これUTF-8の日本語とか入ってきたらどうなんだろー(*´∀`*;;;

もっとコンピュータの基礎を勉強しないとアカンね。と思った一日でした。
おわり。

2012-08-22 | Posted in Java1 Comment » 


関連記事

コメント1件

 ほんじー | 2016.03.04 12:54

解決策その1

static String convertInputStreamToString(BufferedReader is) throws IOException {
BufferedReader reader = new BufferedReader(is);
StringBuilder builder = new StringBuilder();
char[] buf = new char[1024];
int numRead;
while (-1 != (numRead = reader.read())) {
builder.append((char)numRead);
}

return builder.toString();
}

}

Comment





Comment



*