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

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

ただいまの
回答率

90.75%

  • Java

    13134questions

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

標準入力の制御の仕方

受付中

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 133

1221_hima

score 12

  Scanner scanner = new Scanner(System.in);
  String input;

  while(true){
    input = scanner.nextLine();

   ---inputについての処理---

  }

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

class SkipSample {
  public static void main(String[] args) throws Exception {
    try (var isr = new InputStreamReader(System.in, StandardCharsets.UTF_8);
         var br = new BufferedReader(isr)) {
      for (;;) {
        skipPendingInput(br);
        System.out.println("enter:");
        String line = br.readLine();
        if (line == null)
          break;
        System.out.println("input is: " + line);
        System.out.flush();
        //
        Thread.sleep(3000);
        System.out.println("processing completed");
      }
    }
  }

  static void skipPendingInput(BufferedReader br) throws IOException {
    int skipCount = 0;
    while (br.ready()) {
      int c = br.read();
      if (c == -1) break;
      skipCount++;
    }
    if (skipCount > 0) {
      System.out.println(skipCount + " character(s) skipped");
    }
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

while (true) {
    while (System.in.available() > 0) {
        System.in.read();
    }
    input = s.nextLine();
    ---inputについての処理---
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/07 17:12

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

    キャンセル

-1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/07 17:14

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

    キャンセル

  • 2018/05/07 17:18

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

    キャンセル

  • 2018/05/07 17:22

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

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13134questions

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