質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1336閲覧

標準入力の制御の仕方

hi_se_pr

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/05/07 05:38

Java

1 Scanner scanner = new Scanner(System.in); 2 String input; 3 4 while(true){ 5 input = scanner.nextLine(); 6 7 ---inputについての処理--- 8 9 } 10

このような処理を書いた時、inputについての処理が終わる前にキーボードから他の入力を行うと、次の処理の時にその間に行われた入力から処理されます。

inputについて処理している間の入力は無視して、適切なタイミングで入力された文字のみ受理するという処理はどのように書けば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

標準入力、というシステムを使っている以上、内部でバッファリングされるため、入力の順序で貯められ、取り出され、処理されます

ということで、標準入力ではなく、キーボードの操作でやってみるってのはどうでしょう

投稿2018/05/07 07:53

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/05/07 08:14

コンソールアプリケーションでキーイベント的なものを意識するのはそれはそれで難易度が高そうな気がしますw;
y_waiwai

2018/05/07 08:18

C言語とかならウラワザ的にどーこーする方法はあるんですけどねえw
KSwordOfHaste

2018/05/07 08:22

Linuxのターミナルで呪文(stty)を使うとjavaでもそれらしいことはできそうではありますが、Write Once, run Anywhere的でないものをJavaコードに持ち込みたくないという感覚がありますよね。
guest

0

ScannerではちょっとやりづらいところがありますのでReaderを使う方がよいと思います。Javaのbyte/charを読むためのクラス群にあるreadyを利用するとお望みのことに近いことができそうです。

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.nio.charset.StandardCharsets; 5 6class SkipSample { 7 public static void main(String[] args) throws Exception { 8 try (var isr = new InputStreamReader(System.in, StandardCharsets.UTF_8); 9 var br = new BufferedReader(isr)) { 10 for (;;) { 11 skipPendingInput(br); 12 System.out.println("enter:"); 13 String line = br.readLine(); 14 if (line == null) 15 break; 16 System.out.println("input is: " + line); 17 System.out.flush(); 18 // 19 Thread.sleep(3000); 20 System.out.println("processing completed"); 21 } 22 } 23 } 24 25 static void skipPendingInput(BufferedReader br) throws IOException { 26 int skipCount = 0; 27 while (br.ready()) { 28 int c = br.read(); 29 if (c == -1) break; 30 skipCount++; 31 } 32 if (skipCount > 0) { 33 System.out.println(skipCount + " character(s) skipped"); 34 } 35 } 36}

投稿2018/05/07 05:59

編集2018/05/07 08:12
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちゃんとテストしてませんが、これでどうですか?

java

1while (true) { 2 while (System.in.available() > 0) { 3 System.in.read(); 4 } 5 input = s.nextLine(); 6 ---inputについての処理--- 7}

投稿2018/05/07 06:45

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/05/07 08:12

sがバッファリングしてしまうクラスのインスタンスの場合(Scannerもそうだと思います)元になっているストリーム(System.in)を読み飛ばしてもsに先読みしたデータがバッファリングされているとそれが読めてしまいます。自分の回答でScannerがやりづらいと書いたのはScannerに対してreadyとかavailableのようなメソッドがないからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問