1. ホーム
  2. java

[解決済み】Javaでユーザー入力を待機させる方法

2022-01-25 13:06:36

質問

私は自分のチャンネル用のIRCボットを作ろうとしています。ボットはコンソールからコマンドを受け取ることができるようにしたいです。メインループでユーザーが何かを入力するのを待つようにするために、私はこのループを追加しました。

while(!userInput.hasNext());

はうまくいかなかったようです。BufferedReaderのことは聞いたことがありますが、使ったことがないので、これが私の問題を解決できるかどうかはわかりません。

while(true) {
        System.out.println("Ready for a new command sir.");
        Scanner userInput = new Scanner(System.in);

        while(!userInput.hasNext());

        String input = "";
        if (userInput.hasNext()) input = userInput.nextLine();

        System.out.println("input is '" + input + "'");

        if (!input.equals("")) {
            //main code
        }
        userInput.close();
        Thread.sleep(1000);
    }

解決方法は?

入力があるかどうかを確認する必要がなく、入力があるまで待機し、スリープ状態になります。 Scanner.nextLine() は行が空くまでブロックします。

この例をご覧ください。

public class ScannerTest {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try {
            while (true) {
                System.out.println("Please input a line");
                long then = System.currentTimeMillis();
                String line = scanner.nextLine();
                long now = System.currentTimeMillis();
                System.out.printf("Waited %.3fs for user input%n", (now - then) / 1000d);
                System.out.printf("User input was: %s%n", line);
            }
        } catch(IllegalStateException | NoSuchElementException e) {
            // System.in has been closed
            System.out.println("System.in was closed; exiting");
        }
    }
}

行を入力してください
こんにちわ
ユーザーの入力を1.892秒待つ
ユーザー入力:hello
行を入力してください
^D
System.inが閉じられたので、終了する

ということで、あとは Scanner.nextLine() を入力すると、ユーザーが改行を入力するまでアプリが待機します。また、ループ内でスキャナを定義し、次の繰り返しで再び使用することになるため、ループを閉じないようにする必要があります。

Scanner userInput = new Scanner(System.in);
while(true) {
        System.out.println("Ready for a new command sir.");

        String input = userInput.nextLine();
        System.out.println("input is '" + input + "'");

        if (!input.isEmpty()) {
            // Handle input
        }
    }
}