Niech konsola zaczeka na zamknięcie danych wejściowych użytkownika

81

Mam aplikację konsolową, która po wykonaniu swoich zadań musi przekazać użytkownikowi informację zwrotną typu „operacja zakończona” lub „operacja nie powiodła się” oraz szczegółowy opis błędu.

Rzecz w tym, że jeśli po prostu „pozwolę mu działać”, komunikat wyjściowy zostanie wydrukowany, ale konsola zamknie się wkrótce potem, nie pozostawiając czasu na przeczytanie wiadomości.

O ile pamiętam, w C ++ każda aplikacja konsolowa kończy się komunikatem „naciśnij dowolny klawisz, aby wyjść” lub czymś w tym rodzaju. W C # mogę symulować to zachowanie za pomocą pliku

Console.ReadKey();

Ale jak mogę to zrobić w Javie? Używam klasy Scanner, ale biorąc pod uwagę, że „input” to moja instancja Scanner:

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

„Dowolny klucz” zadziała, z wyjątkiem powrotu, co jest tutaj dość dużym problemem. Jakieś wskazówki?

makoshichi
źródło

Odpowiedzi:

102

W Javie byłoby to System.in.read()

x4u
źródło
17
Spełnia to warunek „Naciśnij enter, aby wyjść”, ale nie „Naciśnij dowolny klawisz, aby wyjść”, ponieważ nie będzie kontynuowany, dopóki nie zostanie naciśnięty klawisz Enter.
Niall Thomson
Przypuszczam, że „naciśnij enter, aby wyjść” jest nadal lepsze niż „naciśnij dowolny klawisz OPRÓCZ ENTER, aby wyjść”. Dzięki, to mi wystarczy.
makoshichi
2
@marcolopes Trochę spóźniłem się na imprezę, ale ponieważ pytasz o aplikację, domyślam się, że problem polega na tym, że użytkownik naciska klawisz Enter w GUI lub gdzieś w aplikacji. Muszą nacisnąć klawisz Enter w konsoli, który najprawdopodobniej będzie widoczny tylko wtedy, gdy uruchomisz go w środowisku IDE. Będziesz potrzebować innego rozwiązania, jeśli chcesz nacisnąć klawisz Enter w aplikacji.
Thunderforge
4
System.in.read () czyta dokładnie jeden bajt, ale ENTER może wygenerować 1 lub więcej bajtów na różnych platformach, pamiętaj CRLF w systemie Windows. Może się więc zdarzyć, że kolejne wywołania read bezpośrednio zwracają LF z CRLF pierwszego wywołania i dlatego aplikacja w ogóle nie czeka na wejście.
Thorsten Schöning
import java.io.IOException;wymagane jest również dodanie .
yu yang Jian
24

Chciałbym dodać, że zazwyczaj chcesz, aby program czekał tylko wtedy, gdy jest podłączony do konsoli. W przeciwnym razie (na przykład jeśli jest to część potoku ) nie ma sensu drukować wiadomości ani czekać. W tym celu możesz użyć Javy w Consoleten sposób:

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();
    }
}
Petr
źródło
7

Możesz po prostu użyć nextLine();jako pauzy

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

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

Jednak każdy przycisk, który naciśniesz, z wyjątkiem Enteroznacza, że ​​będziesz musiał nacisnąć Enter po tym, ale znalazłem to lepiej niżscan.next();

MohammadAmin98
źródło
Musisz użyćScanner scan=new Scanner(System.in);
ACV,
5

Użyłem prostego hackowania, prosząc Windows o użycie poleceń cmd i wysłanie go do 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();
    }    
}
Anton Kasiyn
źródło
3

Wpisałem to, co powiedział x4u. Eclipse potrzebowało bloku try catch wokół niego, więc pozwoliłem mu go wygenerować.

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

Prawdopodobnie może mieć na nim różnego rodzaju dzwonki i gwizdki, ale myślę, że dla początkujących, którzy chcą, aby okno wiersza poleceń nie wychodziło, powinno być w porządku.

Nie wiem też, jak często się to zdarza (po raz pierwszy robię pliki jar), ale nie działałoby to samo, tylko przez plik bat.

java.exe -jar mylibrary.jar

Powyższe jest tym, co plik bat miał w tym samym folderze. Wydaje się, że jest to problem z instalacją.

Samouczek Eclipse pochodzi z: http://eclipsetutorial.sourceforge.net/index.html

Część odpowiedzi również pochodziła z: Oracle Thread

dim_voly
źródło
3
public static void main(String args[])
{
    Scanner s = new Scanner(System.in);

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

    s.nextLine();   
}

Jest nextlineto całkiem dobra opcja, ponieważ pomoże nam uruchomić następną linię za każdym razem, gdy zostanie naciśnięty klawisz Enter.

Pranjal Gupta
źródło
1

Prosta sztuczka:

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();
SHKashani
źródło