Lassen Sie die Konsole warten, bis eine Benutzereingabe geschlossen wird

79

Ich habe eine Konsolenanwendung, die nach dem Ausführen ihrer Aufgaben dem Benutzer Feedback geben muss, z. B. "Vorgang abgeschlossen" oder "Vorgang fehlgeschlagen" und den detaillierten Fehler.

Die Sache ist, wenn ich es einfach "laufen lasse", wird die Ausgabemeldung gedruckt, aber die Konsole wird kurz danach geschlossen, so dass keine Zeit zum Lesen der Nachricht bleibt.

Soweit ich mich erinnere, endet in C ++ jede Konsolenanwendung mit einem "Drücken einer beliebigen Taste zum Beenden" oder ähnlichem. In C # kann ich dieses Verhalten mit a simulieren

Console.ReadKey();

Aber wie kann ich das in Java machen? Ich verwende die Scannerklasse, aber angesichts der Tatsache, dass "Eingabe" meine Instanz von Scanner ist:

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

"Jeder Schlüssel" wird funktionieren, außer für die Rückgabe, was hier eine ziemlich große Sache ist. Irgendwelche Hinweise?

Makoshichi
quelle

Antworten:

101

In Java wäre dies System.in.read()

x4u
quelle
17
Dies entspricht "Drücken Sie die Eingabetaste, um das Menü zu verlassen", jedoch nicht "Drücken Sie eine beliebige Taste, um das Menü zu verlassen", da es erst fortgesetzt wird, wenn die Eingabetaste gedrückt wird.
Niall Thomson
Ich nehme an, "Drücken Sie zum Beenden die Eingabetaste" ist immer noch besser als "Drücken Sie eine beliebige Taste, AUSSER zum Beenden die Eingabetaste". Danke, das reicht für mich.
Makoshichi
2
@marcolopes Ich bin etwas spät zur Party, aber da Sie nach einer App fragen, besteht das Problem vermutlich darin, dass der Benutzer die Eingabetaste in der GUI oder an einer anderen Stelle in der App drückt. Sie müssen die Eingabetaste in der Konsole drücken, die höchstwahrscheinlich nur sichtbar ist, wenn Sie sie in einer IDE ausführen. Sie benötigen eine andere Lösung, wenn Sie in einer App die Eingabetaste drücken möchten.
Thunderforge
4
System.in.read () liest genau ein Byte, aber ENTER kann auf verschiedenen Plattformen 1 oder mehr Bytes erzeugen. Denken Sie an CRLF unter Windows. Es kann also sein, dass nachfolgende Leseaufrufe LF direkt von CRLF des ersten Aufrufs zurückgeben und die App daher überhaupt nicht auf Eingaben wartet.
Thorsten Schöning
22

Ich möchte hinzufügen, dass das Programm normalerweise nur warten soll, wenn es mit einer Konsole verbunden ist. Andernfalls (wie wenn es Teil einer Pipeline ist ) macht es keinen Sinn, eine Nachricht zu drucken oder zu warten. Dafür könnten Sie Java Consolewie folgt verwenden:

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
quelle
7

Sie können nur nextLine();als Pause verwenden

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

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

Jede Taste, die Sie drücken, außer, Enterdass Sie danach die Eingabetaste drücken müssen, aber ich fand es besser alsscan.next();

MohammadAmin98
quelle
Sie müssen verwendenScanner scan=new Scanner(System.in);
ACV
5

Ich habe einen einfachen Hack verwendet und Windows gebeten, cmd-Befehle zu verwenden und ihn an null zu senden.

// 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
quelle
3

Ich habe eingegeben, was x4u gesagt hat. Eclipse wollte einen Try-Catch-Block darum herum, also ließ ich ihn für mich generieren.

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

Es kann wahrscheinlich alle möglichen Schnickschnack enthalten, aber ich denke, für Anfänger, die ein Befehlszeilenfenster wünschen, das nicht beendet wird, sollte dies in Ordnung sein.

Ich weiß auch nicht, wie häufig dies vorkommt (dies ist das erste Mal, dass ich JAR-Dateien erstelle), aber es würde nicht von selbst ausgeführt, sondern nur über eine Bat-Datei.

java.exe -jar mylibrary.jar

Das Obige hatte die Bat-Datei im selben Ordner. Scheint ein Installationsproblem zu sein.

Das Eclipse-Tutorial stammt von: http://eclipsetutorial.sourceforge.net/index.html

Einige der Antworten kamen auch von: Oracle Thread

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

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

    s.nextLine();   
}

Dies nextlineist eine ziemlich gute Option, da sie uns hilft, die nächste Zeile auszuführen, wenn die Eingabetaste gedrückt wird.

Pranjal Gupta
quelle
1

Ein einfacher Trick:

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
quelle