• ベストアンサー

キーボード入力について初歩的な質問

現在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文字ごとに入力を受け取ってバッファへ送っている、で合っているでしょうか? どなたか詳しい方いらっしゃいましたら、どうぞよろしくお願い致します。

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • DMXbw
  • ベストアンサー率66% (4/6)
回答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で変換したすべてを返します。

HYSTER
質問者

お礼

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

その他の回答 (1)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

> なぜ"(1)の部分が1行出力されてキーボード入力を待っている状態"が起こるのでしょうか これはSystem.inの仕様よ。 System.inがユーザの入力待ちをする仕様になっているので この動きをするわ。 Javaのストリームっぽく言えば System.inのflushタイミングが、 ユーザのEnterをトリガーにしているのよ。 PrintStreamと同じね。 Readerでラップする場合は PrintWriterと同じになるわ。 > ストレージへ保管~ あなたの提示したコードには ストレージへの保管を行うような場所はないけど。 この質問は何を言っているのかわからないわ。 ここで言うストレージというのは バッファされているものが別の場所に移される という意図でいいのかしら。 だとしたらその回答は flushしたタイミング になるわ。

関連するQ&A

  • 変数のキーボード入力について

    何度も質問してすみません。javaについて質問できるのここしかないんで・・・。早速質問なのですが、変数のキーボードから入力する方法で import java.io.*; class Sample4 { public static void main(String args[]) throws IOException { System.out.println("文字列を入力してください"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); System.out.println(str + "が入力されました"); } } とメモ帳に保存して、コンパイルしたら【文字列を入力してください】(【】は実際には入力してません)とちゃんと出てくるのに次の行にキーボードから入力すると日本語入力が出来なくなります。コマンドプロンプトには日本語入力できないのですか?教えてください。

    • ベストアンサー
    • Java
  • キーボードから文字列を入力する際の質問です。

    キーボードから文字列を入力する際の質問です。 どうしてもカタカナでしか日本語の入力が出来ません。 ローマ字入力です。 import java.io.*; class Sample4 { public static void main(String args[]) throws IOException { System.out.println("文字列を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); System.out.println(str + "が入力されました。"); } }

    • ベストアンサー
    • Java
  • このクラスをもとに2

    import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); System.out.flush(); s = br.readLine(); } } このクラスをもとにプロンプト「Input: 」を出力して、文字列を入力させ、その文字列を反転(例えば"abc"→"cba")させて出力しつづけ、「end」と入力すると終わるプログラムを教えてください。

    • ベストアンサー
    • Java
  • このクラスをもとに…。

    import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); System.out.flush(); s = br.readLine(); } } このクラスをもとにプロンプト「Input: 」を出力して、文字列を入力させ、その文字列をそのまま出力しつづけ、「end」と入力すると終わるプログラムを教えてください。

  • javaのキーボード入力について質問

    javaのキーボード入力について質問です。 下記の如く、javaのソース"Sample4.java"や"Sample4.class"は存在します。 c:\Pleiades44\workspace\Input\src\Sample1\Sample4.java c:\Pleiades44\workspace\Input\bin\Sample1\Sample4.class そのソースの内容は下記です。 このプログラムはPleiades44では、Debugや実行が出来、コンソールに("input integer: ") と表示出来、次に数値を入力しますと、その内容が表示出来ます。 (注、最初のカーソル位置と文字入力位置が違いますが、其処は目をつむります) Q1)このプログラムをPCのコンソールで実行する方法をお教えください。 //======================== package Sample1; //Sample4.java import java.io.BufferedReader; import java.io.InputStreamReader; public class Sample4{ public static void main(String args[]){ int x=9; while(x!=0){ System.out.print("input integer: "); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); try{ String buf = br.readLine(); x = Integer.parseInt(buf); }catch(Exception e){ x = 0; } System.out.println("Input Number = " + x); } //while System.out.println("end"); } } //=============================== 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • このクラスをもとに改。

    import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); System.out.flush(); s = br.readLine(); } } このクラスをもとにプロンプト「Input: 」を出力して、文字列を入力させ、その文字列をそのまま出力しつづけ、「end」と入力すると終わるプログラムを教えてください。例えば Input: abc abc Input: def def Input: end みたいな感じで。。

    • ベストアンサー
    • Java
  • キーボードから入力させる関係のなんですが

    引数を1つ設定してプログラムを起動させて、 引数が"A"の場合、 「Aを起動します」 と表示させたと同時に、 「キーボードから何か入力して下さい」と、 後に続けて表示させ、 入力した文字が Bの場合~~~ Cの場合~~~ といったプログラムはどう組めばよいのでしょうか? --------------------------- import java.io.*; class test { public static void main(String args[]) throws IOException { int x = Integer.parseInt(args[0]); System.out.println( x + "を起動します"); System.out.println("キーボードから何か入力してください"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String pp = br.readLine(); //入力されたのが Bの場合~~~ //        Cの場合~~~  } } --------------------------- 上記はコンパイルできませんが、こういう感じでしょうか?

    • ベストアンサー
    • Java
  • java キーボード入力の構文の意味

    独学でJavaを学んでいるのですが、キーボードからの入力を可能にする構文の意味がよくわかりません。 その構文というのは BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) なのですが、以下の意味理解で間違えていないでしょうか? 【構文としての意味】 Systemクラスのプロパティのinを仮引数にするInputStreamReaderクラスのメモリ領域を確保します。そしてそのメモリ領域を仮引数にするBufferedReaderクラスのメモリ領域を確保します。そしてそのメモリ領域をBurredReaderクラスの変数brに代入します。 【ストリームとしての意味】 標準入力はストリームの内、文字ストリームを通ります(選択します)。その時、バッファを介します。 多分間違っているかと思うのですが、もし修正してくださるのであれば、初心者にもわかル用に教えていただけると幸いです。 ちなみに私は「やさいいJava」をとりあえず読み終わった感じのレベルです。

  • ネットワークプログラミングでの読み込みについて

    現在ネットワークプログラミングの勉強をしています。 クライアント側の標準入力で文字列入力→Enter押下→ サーバ側の標準出力でその文字列を出力 という処理を行いたいのですが、サーバ側の出力が表示されません。 まず具体的にソースを出した方が状況を説明しやすいので、提示致します。 ------------------------------- サーバ側 public static void main(String[] args)throws Exception ServerSocket ss=new ServerSocket(7777); while(true){ sock=ss.accept(); BufferedReader br=new BufferedReader(new InputStreamReader(sock.getInputStream())); String str=br.readLine(); if(str.equals("end"))break; System.out.println(str); } sock.close(); ss.close(); br.close(); } ---------------------------------- クライアント側 public static void main(String[] args)throws Exception { Socket sock=new Socket(コンピュータ名,7777); while(true){ BufferedWriter bw=new BufferedWriter(new InputStreamReader(sock.getOutputStream())); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str=br.readLine(); bw.write(str); bw.flush(); if(str.equals("end"))break; } bw.close(); sock.close(); ---------------------------------- 自分で色々試したところバッファリングで入力された文字列を溜めたまま 吐き出していないのが原因のような気がするのですが、BufferedReader#readLineのドキュメントを見ると >1 行のテキストを読み込みます。1 行の終端は、改行 (「\n」) か、復帰 (「\r」)、または復行とそれに続く改行のどれかで認識されます。 とあるのでクライアント側のbw.write(str)の後にbw.newLine()を呼んだりstr+="\n" などを行ってみたところ、 サーバ側は最初の入力をすぐに出力し、その後のクライアントからの入力には無反応になりました。 このようになる原因と解決が分かる方居ましたら、教えてください。

    • ベストアンサー
    • Java
  • 複数行キーボード入力した後に再度入力する?

    複数行まとめてキーボードから入力を得た後に、再度入力を得たいのですが方法がわからず困っています。 whileループで複数行入力しCTRL_Dで入力終了、その後再度キーボード入力を得るようにコードを書きましたが、うまくいきません。 1、スキャナーを使用 public static void main(String[] args) {  Scanner sc = new Scanner(System.in);  List<String> list = new ArrayList<String>();  System.out.println("Enter several lines:");  while (sc.hasNextLine()) {   list.add(sc.nextLine());  }  System.out.println("\nEnter another line:");  String str = sc.nextLine();  // 上の位置で例外(NoSuchElementException)発生  System.out.println("Done!"); } 2、BufferedReaderを使用 // 例外は発生しないが、二回目の入力が不可 public static void main(String[] args) {  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  List<String> list1 = new ArrayList<String>();  System.out.println("Enter several lines:");  String str;  try {   while ((str = br.readLine())!=null) {    list1.add(str);   }   System.out.println("\nEnter another line:");   String line = br.readLine();   // ↑の位置でキーを何も押していないのに勝手にlineにnullが挿入され、   // Done!が出力される   System.out.println("Done!");  } catch (IOException e) { e.printStackTrace(); } } アドバイス宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう