Заставьте консоль ждать закрытия пользовательского ввода

81

У меня есть консольное приложение, которое после выполнения своих задач должно давать пользователю обратную связь, например «операция завершена» или «операция не удалась» и подробное описание ошибки.

Дело в том, что если я просто «позволю ему поработать», выходное сообщение будет напечатано, но вскоре после этого консоль закроется, не оставив времени на чтение сообщения.

Насколько я помню, в C ++ каждое консольное приложение заканчивалось «нажатием любой клавиши для выхода» или чем-то в этом роде. В C # я могу смоделировать это поведение с помощью

Console.ReadKey();

Но как это сделать на Java? Я использую класс Scanner, но учитывая, что "input" - это мой экземпляр Scanner:

input.next()
System.exit(0);

Подойдет «любой ключ», кроме возврата, что здесь немало. Есть указатели?

макошичи
источник

Ответы:

102

В Java это было бы System.in.read()

x4u
источник
17
Это удовлетворяет условию «Нажмите Enter для выхода», но не «Нажмите любую клавишу для выхода», так как это не будет продолжаться, пока не будет нажата клавиша ввода.
Найл Томсон
Я полагаю, что «нажмите ввод для выхода» все же лучше, чем «нажмите любую клавишу, ЗА ИСКЛЮЧЕНИЕМ ввода для выхода». Спасибо, меня хватит.
makoshichi
2
@marcolopes Я немного опоздал на вечеринку, но, поскольку вы спрашиваете о приложении, я предполагаю, что проблема в том, что вы заставляете пользователя нажимать клавишу ввода в графическом интерфейсе или где-то еще в приложении. Им нужно нажать клавишу ввода в консоли, которая, скорее всего, будет видна только в том случае, если вы запускаете ее в среде IDE. Вам понадобится другое решение, если вы хотите нажать клавишу ВВОД в приложении.
Thunderforge
4
System.in.read () читает ровно один байт, но ENTER может выдать 1 или более байтов на разных платформах, помните CRLF в Windows. Таким образом, может случиться так, что последующие вызовы чтения напрямую возвращают LF из CRLF первого вызова, и поэтому приложение вообще не ждет ввода.
Торстен Шёнинг
import java.io.IOException;также требуется добавление .
Ю Ян Цзянь
24

Я хотел бы добавить, что обычно вы хотите, чтобы программа ждала, только если она подключена к консоли. В противном случае (например, если это часть конвейера ) нет смысла печатать сообщение или ждать. Для этого вы можете использовать Java Consoleследующим образом:

import java.io.Console;
// ...
public static void waitForEnter(String message, Object... args) {
    Console c = System.console();
    if (c != null) {
        // printf-like arguments
        if (message != null)
            c.format(message, args);
        c.format("\nPress ENTER to proceed.\n");
        c.readLine();
    }
}
Петр
источник
9

Проблема с вводом консоли Java заключается в том, что он буферизирован и требует ввода клавиши для продолжения.

Есть эти два обсуждения: обнаружение и действие на клавиши направления клавиатуры в Java и анализ ввода клавиатуры Java в консольном приложении.

Последний из них использовал JLine для решения своей проблемы.

Лично я им не пользовался.

Преподобный Гонзо
источник
7

Вы можете просто использовать nextLine();как паузу

import java.util.Scanner
//
//
Scanner scan = new Scanner(System.in);

void Read()
{
     System.out.print("Press any key to continue . . . ");
     scan.nextLine();
}

Однако любая кнопка, которую вы нажимаете, кроме Enterозначает, что вам нужно будет нажать Enter после этого, но я нашел это лучше, чемscan.next();

МохаммадАмин98
источник
Вам нужно использоватьScanner scan=new Scanner(System.in);
ACV
5

Я использовал простой взлом, попросив окна использовать команды cmd и отправив его на null.

// Class for Different hacks for better CMD Display
import java.io.IOException;
public class CMDWindowEffets
{
    public static void getch() throws IOException, InterruptedException
    {
        new ProcessBuilder("cmd", "/c", "pause > null").inheritIO().start().waitFor();
    }    
}
Антон Касийн
источник
3

Я вставил то, что сказал x4u. Eclipse хотел, чтобы вокруг него был блок try catch, поэтому я позволил ему сгенерировать его для меня.

try {
        System.in.read();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Вероятно, на нем могут быть всевозможные навороты, но я думаю, что для новичков, которые хотят, чтобы окно командной строки не выходило из этого, должно быть хорошо.

Также я не знаю, насколько это распространено (я впервые делаю файлы jar), но он не запускался сам по себе, только через файл bat.

java.exe -jar mylibrary.jar

Это то, что было у файла bat в той же папке. Кажется, проблема с установкой.

Руководство по Eclipse взято из: http://eclipsetutorial.sourceforge.net/index.html

Часть ответа также пришла из: Oracle Thread

dim_voly
источник
3
public static void main(String args[])
{
    Scanner s = new Scanner(System.in);

    System.out.println("Press enter to continue.....");

    s.nextLine();   
}

Это nextlineдовольно хороший вариант, поскольку он поможет нам запускать следующую строку при каждом нажатии клавиши ввода.

Пранджал Гупта
источник
1

Простой трюк:

import java.util.Scanner;  

/* Add these codes at the end of your method ...*/

Scanner input = new Scanner(System.in);
System.out.print("Press Enter to quit...");
input.nextLine();
ШКашани
источник