Java: borrar la consola

Respuestas:

111

Dado que aquí hay varias respuestas que muestran código que no funciona para Windows, aquí hay una aclaración:

Runtime.getRuntime().exec("cls");

Este comando no funciona, por dos razones:

  1. No hay un ejecutable con nombre cls.exeo cls.comen una instalación estándar de Windows que se pueda invocar Runtime.exec, ya que el conocido comando clsestá integrado en el intérprete de línea de comandos de Windows.

  2. Al iniciar un nuevo proceso a través de Runtime.exec, la salida estándar se redirige a una tubería que el proceso iniciador de Java puede leer. Pero cuando la salida del clscomando se redirige, no borra la consola.

Para resolver este problema, tenemos que invocar al intérprete de línea de comandos ( cmd) y decirle que ejecute un comando ( /c cls) que permite invocar comandos incorporados. Además, debemos conectar directamente su canal de salida al canal de salida del proceso Java, que funciona a partir de Java 7, utilizando inheritIO():

import java.io.IOException;

public class CLS {
    public static void main(String... arg) throws IOException, InterruptedException {
        new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
    }
}

Ahora, cuando el proceso Java está conectado a una consola, es decir, se ha iniciado desde una línea de comandos sin redirección de salida, borrará la consola.

Holger
fuente
1
¿Por qué esto no funciona para mí?
Ejecuto
87

Puede usar el siguiente código para borrar la consola de línea de comandos:

public static void clearScreen() {  
    System.out.print("\033[H\033[2J");  
    System.out.flush();  
}  

Para más referencias visite: http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html

satish
fuente
2
¿Te importaría agregar algo a esto? ¿Qué es esta cadena y necesita enjuagar si el autoenjuague está habilitado?
cosaco el
77
Son códigos de escape ANSI . Pantalla específicamente clara, seguida de inicio . ¿Pero por qué es necesario 'hogar'?
jdurston
2
@jdurston omitiendo inicio no restablecerá el cursor a la parte superior de la ventana.
Hugo Zink
1
No funciona en Eclipse, pero funciona en la terminal de Linux. Un voto por ti
Anh Tuan
77
Esto solo funciona si el emulador de terminal en el que se ejecuta Java admite códigos de escape ANSI. Windows NT / XP / 7/8/10 CMD no lo hace
Thorbjørn Ravn Andersen
19

Así es como lo manejaría. Este método funcionará para el caso del sistema operativo Windows y el caso del sistema operativo Linux / Unix (lo que significa que también funciona para Mac OS X).

public final static void clearConsole()
{
    try
    {
        final String os = System.getProperty("os.name");

        if (os.contains("Windows"))
        {
            Runtime.getRuntime().exec("cls");
        }
        else
        {
            Runtime.getRuntime().exec("clear");
        }
    }
    catch (final Exception e)
    {
        //  Handle any exceptions.
    }
}

Tenga en cuenta que este método generalmente no borrará la consola si está ejecutando dentro de un IDE.

Dyndrilliac
fuente
10
En Windows 8.1:java.io.IOException: Cannot run program "cls": CreateProcess error=2, The system cannot find the file specified
Ben Leggiero,
1
@BenLeggiero Ese error ocurre si por alguna razón la JVM no encuentra el comando cls en algún directorio de la variable de entorno PATH. Todo lo que hace este código es llamar al comando del sistema de Windows o Unix en función de la configuración predeterminada del sistema para borrar el símbolo del sistema o la ventana de terminal respectivamente. Debería ser exactamente lo mismo que abrir una ventana de terminal y escribir "cls" seguido de la tecla Intro.
Dyndrilliac
22
No hay clsejecutable en Windows. Es un comando interno de cmd.exe.
a_horse_with_no_name
77
Como han dicho otros, no funciona en absoluto , no solo porque Windows no tiene cls ejecutables, sino también porque la salida de los subprocesos se redirige.
Holger
2
Esta respuesta también es un tema sobre meta ver: meta.stackoverflow.com/questions/308950/…
Petter Friberg
15

Una forma de obtener esto puede ser imprimir varios extremos de líneas ("\ n") y simular la pantalla clara. Al final claro, a lo sumo en el shell de Unix, no elimina el contenido anterior, solo lo mueve hacia arriba y si lo hace desplazarse hacia abajo puede ver el contenido anterior.

Aquí hay un código de muestra:

for (int i = 0; i < 50; ++i) System.out.println();
loto negro
fuente
13
Una forma más rápida de lograr esto es imprimir una sola cadena de 50 \r\ncon una sola println, ya que hay un retraso notable entre las printlnllamadas.
Ben Leggiero
77
¿Cómo sabe cuántas líneas está configurada para mostrar la consola? Podría funcionar en la mayoría de los casos, pero no en todos.
Cypher
44
La mayor diferencia entre esto y lo correcto cleares que en este último, la nueva salida estará en la parte superior de la pantalla y no en la parte inferior.
ndm13
55
System.out.println(new String(new char[50]).replace("\0", "\r\n"));hará el trabajo más rápido y mejor.
Aaron Esau
1
@AaronEsau comenzando con JDK 11, puedes usarSystem.out.println(System.lineSeparator().repeat(50));
Holger el
15

Si desea un sistema más independiente manera de hacer esto, puede utilizar la JLine biblioteca y ConsoleReader.clearScreen () . Probablemente valga la pena hacer una comprobación prudente de si JLine y ANSI son compatibles con el entorno actual.

Algo como el siguiente código funcionó para mí:

import jline.console.ConsoleReader;

public class JLineTest
{
    public static void main(String... args)
    throws Exception
    {
        ConsoleReader r = new ConsoleReader();

        while (true)
        {
            r.println("Good morning");
            r.flush();

            String input = r.readLine("prompt>");

            if ("clear".equals(input))
                r.clearScreen();
            else if ("exit".equals(input))
                return;
            else
                System.out.println("You typed '" + input + "'.");

        }
    }
}

Al ejecutar esto, si escribe 'borrar' en el indicador, se borrará la pantalla. Asegúrese de ejecutarlo desde una terminal / consola adecuada y no en Eclipse.

prunge
fuente
14

Cree un método en su clase como este: [como @Holger dijo aquí .]

public static void clrscr(){
    //Clears Screen in java
    try {
        if (System.getProperty("os.name").contains("Windows"))
            new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
        else
            Runtime.getRuntime().exec("clear");
    } catch (IOException | InterruptedException ex) {}
}

Esto funciona para Windows al menos, no he verificado Linux hasta ahora. Si alguien lo comprueba para Linux, avíseme si funciona (o no).

Como método alternativo es escribir este código en clrscr():

for(int i = 0; i < 80*300; i++) // Default Height of cmd is 300 and Default width is 80
    System.out.print("\b"); // Prints a backspace

No te recomendaré que uses este método.

Abhishek Kashyap
fuente
1
¡Funciona bien para Windows 10!
gaurav
7

Runtime.getRuntime (). Exec (cls) NO funcionó en mi computadora portátil XP. Esto hizo ...

for(int clear = 0; clear < 1000; clear++)
  {
     System.out.println("\b") ;
  }

Espero que esto sea útil

usuario3648739
fuente
si pudiera establecer la ubicación del índice del búfer para comenzar, este sería el único enfoque más fácil
DevilInDisguise
1
Si se interrumpe el proceso, imagino que verías un retraso con algunas impresiones que se eliminan antes que otras.
TrevorLee
7

Intenta lo siguiente:

System.out.print("\033\143");

Esto funcionará bien en un entorno Linux

Bhuvanesh Waran
fuente
2

Esto funcionará si está haciendo esto en Bluej o en cualquier otro software similar.

System.out.print('\u000C');
Abhigyan Singh
fuente
1

Puede usar una emulación de clscon for (int i = 0; i < 50; ++i) System.out.println();

Épico
fuente
2
Es solo una pista, tal vez alguien quiera borrar la pantalla, en realidad
Sarz
@Sarz: y en realidad "limpiar la pantalla" tampoco tiene el sentido adecuado por sí mismo
Gyom
0

Debe usar caracteres de control como barra diagonal inversa (\ b) y retorno de carro (\ r). Viene deshabilitado de forma predeterminada, pero la vista Consola puede interpretar estos controles.

Windows> Preferencias y Ejecutar / Depurar> Consola y seleccione Interpretar caracteres de control ASCII para habilitarlo

Preferencias de consola en Eclipse

Después de estas configuraciones, puede administrar su consola con caracteres de control como:

\ t - tab.

\ b - retroceso (un paso hacia atrás en el texto o eliminación de un solo carácter).

\ n - nueva línea.

\ r - retorno de carro. ()

\ f - formulario de alimentación.

animación eclipse console clear

Más información en: https://www.eclipse.org/eclipse/news/4.14/platform.php

Grégori Fernandes de Lima
fuente
-2

Necesitas usar JNI.

En primer lugar, crea un .dll usando Visual Studio, ese sistema de llamadas ("cls"). Después de eso, use JNI para usar este DDL.

Encontré este artículo que es bueno:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=5170&lngWId=2

Denny
fuente
Eso es trabajo para mi. Tengo un proyecto real usando JNI para borrar la pantalla en JAVA.
Denny
En Hungría, decimos "Golpea la mosca con una maza".
Ambrus el