現在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文字ごとに入力を受け取ってバッファへ送っている、で合っているでしょうか?
どなたか詳しい方いらっしゃいましたら、どうぞよろしくお願い致します。
No.1
- 回答日時:
> なぜ"(1)の部分が1行出力されてキーボード入力を待っている状態"が起こるのでしょうか
これはSystem.inの仕様よ。
System.inがユーザの入力待ちをする仕様になっているので
この動きをするわ。
Javaのストリームっぽく言えば
System.inのflushタイミングが、
ユーザのEnterをトリガーにしているのよ。
PrintStreamと同じね。
Readerでラップする場合は
PrintWriterと同じになるわ。
> ストレージへ保管~
あなたの提示したコードには
ストレージへの保管を行うような場所はないけど。
この質問は何を言っているのかわからないわ。
ここで言うストレージというのは
バッファされているものが別の場所に移される
という意図でいいのかしら。
だとしたらその回答は
flushしたタイミング
になるわ。
No.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で変換したすべてを返します。
お二人の回答を併せてようやく理解出来ました☆
ストレージについてもこれまで勘違いしていました;
askaaskaさん、DMXbwさん、ご親切にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- デスクトップパソコン 認証コードが入力できない(同じ数字が次のマスにも勝手に入力される) 8 2023/01/27 12:53
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Word(ワード) Windows11キーボードの調子が悪いので治し方を教えてください。 【症状】 1つ目 キーボードの 5 2022/07/03 14:51
- Excel(エクセル) ①Excel シートに、「=」を入力したいのですが、shift+「ほ」を押すと、「_」と入力されます 2 2022/04/28 12:59
- iPad iPad で Apple Pencil を使いメモアプリで文字をキーボードから打ち込みたいのですが描 2 2022/10/05 20:49
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- マウス・キーボード Google検索の英語キーボード 英語のキーボードの配列が元に戻らなくなりました まえの配列は左上に 1 2022/06/19 11:41
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
scanfが2回使えない・・・?;
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
"scanf"でエンターで改行させな...
-
if文の条件にscanf関数を使うと…?
-
2進数の1の数を数える問題
-
cout関数を使っているのですが...
-
プログラミングの問題で、キー...
-
プログラミングの問題です 「金...
-
scanf が無視されます
-
scanf関数について
-
C言語 逆ピラミッドの作り方
-
scanf("%s", buf);でスペースを...
-
Eclipseコンソール表示を、リセ...
-
VBでの日付入力値のフォーマッ...
-
enterでループ終了
-
UWSCで変数をキー入力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
double型が正常に認識されてい...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
Excel VBAで、Application.Inpu...
-
C言語について。
-
batプログラム上で文字列を入力...
-
*をユーザーが入力した数字の数...
-
cout関数を使っているのですが...
-
漢字のソートについて
-
数字以外が入力されたらエラー...
-
Userformの入力順序をタブオー...
-
ワードで文字を入力する時の変...
-
Linuxで入力待ちなしkeyread関...
-
java初心者です。入力されたの...
-
EDITコントロールで入力できる...
-
Eclipseコンソール表示を、リセ...
-
小数か整数かを判定する方法
-
C言語scanf_sで何故か2回入力に...
-
VB.NETで16進数+16進数や16進...
-
Linuxプログラミングで、キーボ...
おすすめ情報