Java: limpe o console


Respostas:


111

Como existem várias respostas aqui mostrando o código que não funciona para Windows, aqui está um esclarecimento:

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

Este comando não funciona, por dois motivos:

  1. Não há executável nomeado cls.exeou cls.comem uma instalação padrão do Windows que possa ser chamada Runtime.exec, pois o comando conhecido clsé incorporado ao interpretador de linha de comando do Windows.

  2. Ao iniciar um novo processo Runtime.exec, a saída padrão é redirecionada para um canal que o processo Java inicial pode ler. Mas quando a saída do clscomando é redirecionada, ela não limpa o console.

Para resolver esse problema, precisamos chamar o interpretador de linha de comando ( cmd) e solicitar que ele execute um comando ( /c cls) que permita chamar comandos internos. Além disso, temos que conectar diretamente seu canal de saída ao canal de saída do processo Java, que funciona a partir do Java 7, usando 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();
    }
}

Agora, quando o processo Java estiver conectado a um console, ou seja, foi iniciado a partir de uma linha de comandos sem redirecionamento de saída, ele limpará o console.


1
Por que isso não funciona para mim? Eu executar o programa em janelas CMD mas a tela não a sua apagada
Alist3r

87

Você pode usar o seguinte código para limpar o console da linha de comandos:

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

Para mais referências, visite: http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html


2
Gostaria de acrescentar isso? O que é essa string e você precisa liberar se o autoflush estiver ativado?
Cossacksman

7
Eles são códigos de escape ANSI . Tela especificamente clara, seguida de casa . Mas por que o 'lar' é necessário?
jdurston

2
@jdurston omitindo home não redefinirá o cursor de volta ao topo da janela.
Hugo Zink

1
Não funciona no Eclipse, mas funciona no terminal Linux. Um voto para você
Anh Tuan

7
Isso funciona apenas se o emulador de terminal no qual o Java é executado, suportar códigos de escape ANSI. Windows NT / XP / 7/8/10 CMD não
Thorbjørn Ravn Andersen

19

É assim que eu lidaria com isso. Esse método funcionará para os casos do sistema operacional Windows e Linux / Unix OS (o que significa que também funciona para o 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.
    }
}

Observe que esse método geralmente não limpará o console se você estiver executando dentro de um IDE.


10
No Windows 8.1:java.io.IOException: Cannot run program "cls": CreateProcess error=2, The system cannot find the file specified
Ben Leggiero 21/10

1
@BenLeggiero Esse erro ocorre se, por algum motivo, o comando cls não for encontrado pela JVM em algum diretório da variável de ambiente PATH. Tudo o que esse código faz é chamar o comando do sistema Windows ou Unix com base na configuração padrão do sistema para limpar o prompt de comando ou a janela do terminal, respectivamente. Deve ser exatamente o mesmo que abrir uma janela do terminal e digitar "cls" seguido da tecla Enter.
Dyndrilliac

22
Não há clsexecutável no Windows. É um comando interno de cmd.exe.
a_horse_with_no_name

7
Como já foi dito por outros, não funciona , não apenas porque o Windows não possui cls executáveis, mas também porque a saída de subprocessos é redirecionada.
Holger

2
Esta resposta também é um tópico na meta ver: meta.stackoverflow.com/questions/308950/…
Petter Friberg

15

Uma maneira de obter isso pode ser imprimir várias final de linhas ("\ n") e simular a tela limpa. No final, claro, no máximo no shell unix, não remove o conteúdo anterior, apenas o move para cima e, se você rolar para baixo, poderá ver o conteúdo anterior.

Aqui está um código de exemplo:

for (int i = 0; i < 50; ++i) System.out.println();

13
Uma maneira mais rápida de fazer isso é imprimir uma única sequência de 50 \r\ncom uma única println, pois há um atraso perceptível entre as printlnchamadas.
Ben Leggiero 22/10

7
Como você sabe quantas linhas o console está configurado para exibir? Pode funcionar na maioria dos casos, mas não em todos.
Cypher

4
A maior diferença entre isso e o adequado clearé que, no último, a nova saída estará na parte superior da tela e não na parte inferior.
Ndm13 12/07/16

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));fará o trabalho mais rápido e melhor.
Aaron Esau

1
@AaronEsau, começando com JDK 11, você pode usarSystem.out.println(System.lineSeparator().repeat(50));
Holger

15

Se você quiser uma maneira independente sistema mais de fazer isso, você pode usar o JLine biblioteca e ConsoleReader.clearScreen () . Provavelmente, também vale a pena verificar se JLine e ANSI são suportados no ambiente atual.

Algo como o seguinte código funcionou para mim:

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 + "'.");

        }
    }
}

Ao executar isso, se você digitar 'clear' no prompt, a tela será limpa. Certifique-se de executá-lo a partir de um terminal / console adequado e não no Eclipse.


14

Crie um método em sua classe como este: [como @Holger disse aqui .]

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) {}
}

Isso funciona para o Windows, pelo menos, eu não verifiquei o Linux até agora. Se alguém verificar o Linux, informe-me se funciona (ou não).

Como método alternativo é escrever este código em 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

Não vou recomendar que você use esse método.


1
funciona bem para o windows 10!
gaurav 16/07

7

Runtime.getRuntime (). Exec (cls) NÃO funcionou no meu laptop XP. Isso fez -

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

Espero que isso seja útil


se você pudesse definir o local do índice do buffer para iniciar, essa seria a única abordagem mais fácil.
DevilInDisguise

1
Se o processo fosse interrompido, imagino que você veria o atraso com algumas impressões. Fora removidas antes de outras.
precisa saber é o seguinte

7

Tente o seguinte:

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

Isso funcionará bem no ambiente Linux


2

Isso funcionará se você estiver fazendo isso no Bluej ou em qualquer outro software similar.

System.out.print('\u000C');

1

Você pode usar uma emulação de clscom for (int i = 0; i < 50; ++i) System.out.println();


2
É apenas uma dica, talvez alguém queira limpar a tela, na verdade
Sarz

@Sarz: e, na verdade, "limpar a tela" não faz sentido próprio, por si só, seja
Gyom

0

Você precisa usar caracteres de controle como barra invertida (\ b) e retorno de carro (\ r). Ele é desativado por padrão, mas a exibição do console pode interpretar esses controles.

Windows> Preferências e Executar / Depurar> Console e selecione Interpretar caracteres de controle ASCII para ativá-lo

Preferências do console no Eclipse

Após essas configurações, você pode gerenciar seu console com caracteres de controle como:

guia \ t.

\ b - backspace (um passo atrás no texto ou exclusão de um único caractere).

\ n - nova linha.

retorno de carro. ()

\ f - forma o feed.

console eclipse animação clara

Mais informações em: https://www.eclipse.org/eclipse/news/4.14/platform.php


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.