Haga que la consola espere a que se cierre la entrada de un usuario

81

Tengo una aplicación de consola que luego de realizar sus tareas, debe dar retroalimentación al usuario, como "operación completada" o "operación fallida" y el error detallado.

El caso es que si simplemente "lo dejo correr", el mensaje de salida se imprimirá pero la consola se cerrará poco después, sin dejar tiempo para leer el mensaje.

Por lo que recuerdo, en C ++, cada aplicación de consola terminará con "presione cualquier tecla para salir" o algo así. En C # puedo simular este comportamiento con un

Console.ReadKey();

Pero, ¿cómo puedo hacerlo en Java? Estoy usando la clase Scanner, pero dado que "input" es mi instancia de Scanner:

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

"Cualquier clave" funcionará, excepto la devolución, que es un gran problema aquí. ¿Algún consejo?

makoshichi
fuente

Respuestas:

102

En Java esto sería System.in.read()

x4u
fuente
17
Esto satisface "Presione enter para salir" pero no "Presione cualquier tecla para salir", ya que no continuará hasta que se presione la tecla enter.
Niall Thomson
Supongo que "presione enter para salir" es aún mejor que "presione cualquier tecla EXCEPTO enter para salir". Gracias, eso me servirá.
makoshichi
2
@marcolopes Llego un poco tarde a la fiesta, pero como preguntas sobre una aplicación, supongo que el problema es que el usuario debe presionar la tecla Intro en la GUI o en algún otro lugar dentro de la aplicación. Deben presionar la tecla Intro en la consola, que probablemente solo estará visible si lo está ejecutando dentro de un IDE. Necesitará una solución diferente si desea presionar Intro dentro de una aplicación.
Thunderforge
4
System.in.read () lee exactamente un byte, pero ENTER puede producir 1 o más bytes en diferentes plataformas, recuerde CRLF en Windows. Por lo tanto, puede ser que las siguientes llamadas de lectura devuelvan directamente LF de CRLF de la primera llamada y, por lo tanto, la aplicación no espera en absoluto la entrada.
Thorsten Schöning
import java.io.IOException;también se requiere agregar .
Yu yang Jian
24

Me gustaría agregar que, por lo general, querrá que el programa espere solo si está conectado a una consola. De lo contrario (como si fuera parte de una canalización ) no tiene sentido imprimir un mensaje o esperar. Para eso, podrías usar Java Consolecomo este:

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

Puedes usarlo nextLine();como pausa

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

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

Sin embargo, cualquier botón que presione excepto Entersignifica que tendrá que presionar Enter después de eso, pero lo encontré mejor quescan.next();

MohammadAmin98
fuente
Necesita usarScanner scan=new Scanner(System.in);
ACV
5

Usé un truco simple, pidiéndole a Windows que usara comandos cmd y lo enviara a 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
fuente
3

He incluido lo que dijo x4u. Eclipse quería un bloque de captura de prueba a su alrededor, así que dejé que lo generara por mí.

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

Probablemente pueda tener todo tipo de campanas y silbidos, pero creo que para los principiantes que desean una ventana de línea de comandos que no salga, esto debería estar bien.

Además, no sé qué tan común es esto (esta es la primera vez que hago archivos jar), pero no se ejecutaría solo, solo a través de un archivo bat.

java.exe -jar mylibrary.jar

Lo anterior es lo que tenía el archivo bat en la misma carpeta. Parece ser un problema de instalación.

El tutorial de Eclipse vino de: http://eclipsetutorial.sourceforge.net/index.html

Algunas de las respuestas también provienen de: Oracle Thread

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

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

    s.nextLine();   
}

Esta nextlinees una opción bastante buena, ya que nos ayudará a ejecutar la siguiente línea cada vez que se presione la tecla Intro.

Pranjal Gupta
fuente
1

Un simple truco:

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
fuente