アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在Javaを勉強中で、ユーザーのキーボード入力を読み込んで表示する簡単なプログラムで疑問があります。

----------サンプルコード(読みにくいので例外処理を省略)--------------------------
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

for(int i=0;i<5;i++){
System.out.print("文字を入力して下さい>>");//・・(1)
arr[i] = br.readLine(); //キーボード入力を読み込み・・(2)
}
----------------------------------------------------------
疑問なのは内部での処理なのですが、
上のコードを実行すると、(1)の部分が1行出力されてキーボード入力を待っている状態になります。
ここで適当な文字を入力してキーボードのEnterを押すと、入力が配列へコピーされ、再度ループ頭の(1)へ戻ります。

なぜ"(1)の部分が1行出力されてキーボード入力を待っている状態"が起こるのでしょうか?

自分なりの予想としてはreadLine()は行末までのバッファリングをするので、行末を知らせるEnterを押すまでreadLine()が動き続けているのかなと思うのですが確証がありません。

また、バッファについてですが、ストレージへ保管されるタイミングはキーボード入力を1文字入力するごとでしょうか?Enterを押したタイミングでしょうか?
これについてはInputStreamReaderってのが1文字ごとに入力を受け取ってバッファへ送っている、で合っているでしょうか?

どなたか詳しい方いらっしゃいましたら、どうぞよろしくお願い致します。

A 回答 (2件)

> なぜ"(1)の部分が1行出力されてキーボード入力を待っている状態"が起こるのでしょうか


これはSystem.inの仕様よ。
System.inがユーザの入力待ちをする仕様になっているので
この動きをするわ。
Javaのストリームっぽく言えば
System.inのflushタイミングが、
ユーザのEnterをトリガーにしているのよ。
PrintStreamと同じね。
Readerでラップする場合は
PrintWriterと同じになるわ。


> ストレージへ保管~
あなたの提示したコードには
ストレージへの保管を行うような場所はないけど。
この質問は何を言っているのかわからないわ。
ここで言うストレージというのは
バッファされているものが別の場所に移される
という意図でいいのかしら。
だとしたらその回答は
flushしたタイミング
になるわ。
    • good
    • 0

>なぜ"(1)の部分が1行出力されてキーボード入力を待っている状態"が起こるのでしょうか?



厳密に言うと入力を待っている状態はreadLine()です。(つまり(2)になります)
System.inというのがキーボード入力のストリームを取得します。
この入力ストリーム(InputStream)のread(byte[] b)でキーボードの入力を待ちます。
この場合readLine()の処理の途中でこれが実行されていると考えてください。

>また、バッファについてですが、ストレージへ保管されるタイミングはキーボード入力を1文字入力するごとでしょうか?Enterを押したタイミングでしょうか?

ストレージとはHDDなど電源を切った(処理が終了した)後でもデータが残っている場所のことを言います。
おそらくこの場合arr[i]に保管していることを言っていると思うので「メモリに保管する」もしくは「変数に保管する」が正しいと思います。
で、回答ですが、System.inがEnterを押下したタイミングでそれまで入力した文字をInputStreamに取得します。(つまりflushする)
Enterが押下されるまではプログラム上では何も起きていません。
ただし、InputStreamはバイトで取得するため、InputStreamReaderで1文字ずつ文字に変換し、BufferedReaderで変換したすべてを返します。
    • good
    • 0
この回答へのお礼

お二人の回答を併せてようやく理解出来ました☆
ストレージについてもこれまで勘違いしていました;
askaaskaさん、DMXbwさん、ご親切にありがとうございました。

お礼日時:2009/05/19 15:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!