Дозвольте консолі дочекатися закриття вводу користувача


81

У мене є консольний додаток, який після виконання своїх завдань повинен надіслати користувачеві зворотний зв'язок, наприклад "операція завершена" або "операція не вдалася" та детальна помилка.

Справа в тому, що якщо я просто "пущу", вихідне повідомлення буде надруковано, але консоль незабаром закриється, не залишаючи часу для читання повідомлення.

Наскільки я пам’ятаю, у C ++ кожна консольна програма закінчуватиметься "натисніть будь-яку клавішу для виходу" або чимось подібним. У C # я можу моделювати цю поведінку за допомогою

Console.ReadKey();

Але як я можу це зробити на Java? Я використовую клас Scanner, але враховуючи, що "input" - це мій екземпляр Scanner:

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

"Будь-який ключ" спрацює, крім повернення, що тут досить велика справа. Будь-які вказівники?

Відповіді:


102

На Java це було б System.in.read()


17
Це відповідає "Натисніть клавішу Enter, щоб вийти", але не "Натисніть будь-яку клавішу, щоб вийти", оскільки вона не триватиме, доки не буде натиснута клавіша Enter.
Найл Томсон,

Я вважаю, що "натиснути клавішу enter, щоб вийти", все-таки краще, ніж "натиснути будь-яку клавішу, окрім Enter, щоб вийти". Дякую, це допоможе мені.
makoshichi

2
@marcolopes Я трохи запізнився на вечірку, але оскільки ви запитуєте про програму, я здогадуюсь, проблема полягає в тому, що користувач натискає клавішу Enter у графічному інтерфейсі користувача або десь ще в додатку. Їм потрібно натиснути клавішу Enter на консолі, яка, швидше за все, буде видно, лише якщо ви запускаєте її в середовищі IDE. Вам потрібно інше рішення, якщо ви хочете натиснути клавішу Enter у програмі.
Thunderforge

4
System.in.read () читає рівно один байт, але ENTER може видавати 1 або більше байт на різних платформах, пам’ятайте CRLF в Windows. Тож може бути так, що наступні виклики читання безпосередньо повертають LF з CRLF першого дзвінка, і тому додаток взагалі не чекає введення.
Торстен Шенінг,

додавання import java.io.IOException;також потрібно.
yu yang Jian

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 полягає в тому, що це буферизоване введення і для продовження потрібно клавішу Enter.

Існують ці дві дискусії: Виявлення та дії на клавіші керування клавіатурою в 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();


Вам потрібно скористатисяScanner scan=new Scanner(System.in);
ACV

5

Я використовував простий хак, просячи Windows використовувати команди 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 {
        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


3
public static void main(String args[])
{
    Scanner s = new Scanner(System.in);

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

    s.nextLine();   
}

Це nextlineдосить хороший варіант, оскільки він допоможе нам запустити наступний рядок при кожному натисканні клавіші Enter.


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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.