- ベストアンサー
キーボード入力について初歩的な質問
現在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文字ごとに入力を受け取ってバッファへ送っている、で合っているでしょうか? どなたか詳しい方いらっしゃいましたら、どうぞよろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>なぜ"(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で変換したすべてを返します。
その他の回答 (1)
- askaaska
- ベストアンサー率35% (1455/4149)
> なぜ"(1)の部分が1行出力されてキーボード入力を待っている状態"が起こるのでしょうか これはSystem.inの仕様よ。 System.inがユーザの入力待ちをする仕様になっているので この動きをするわ。 Javaのストリームっぽく言えば System.inのflushタイミングが、 ユーザのEnterをトリガーにしているのよ。 PrintStreamと同じね。 Readerでラップする場合は PrintWriterと同じになるわ。 > ストレージへ保管~ あなたの提示したコードには ストレージへの保管を行うような場所はないけど。 この質問は何を言っているのかわからないわ。 ここで言うストレージというのは バッファされているものが別の場所に移される という意図でいいのかしら。 だとしたらその回答は flushしたタイミング になるわ。
お礼
お二人の回答を併せてようやく理解出来ました☆ ストレージについてもこれまで勘違いしていました; askaaskaさん、DMXbwさん、ご親切にありがとうございました。