Java: cancella la console


Risposte:


111

Dato che ci sono diverse risposte che mostrano codice non funzionante per Windows, ecco un chiarimento:

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

Questo comando non funziona, per due motivi:

  1. Non esiste un file eseguibile denominato cls.exeo cls.comin un'installazione standard di Windows che possa essere richiamato tramite Runtime.exec, poiché il noto comando clsè incorporato nell'interprete della riga di comando di Windows.

  2. Quando si avvia un nuovo processo tramite Runtime.exec, l'output standard viene reindirizzato a una pipe che può essere letta dal processo Java di avvio. Ma quando l'output del clscomando viene reindirizzato, non cancella la console.

Per risolvere questo problema, dobbiamo invocare l'interprete della riga di comando ( cmd) e dirgli di eseguire un comando ( /c cls) che consente di richiamare i comandi integrati. Inoltre, dobbiamo collegare direttamente il suo canale di output al canale di output del processo Java, che funziona a partire da 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();
    }
}

Ora quando il processo Java è collegato a una console, ovvero è stato avviato da una riga di comando senza reindirizzamento dell'output, cancellerà la console.


1
Perché questo non funziona per me? Sto eseguendo il programma su Windows CMD ma lo schermo non viene cancellato
Alist3r

87

È possibile utilizzare il seguente codice per cancellare la console della riga di comando:

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

Per ulteriori riferimenti visitare: http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html


2
Vuoi aggiungere a questo? Cos'è questa stringa e devi svuotare se l'autoflush è abilitato?
cossacksman,

7
Sono codici di escape ANSI . Schermata specificamente chiara, seguita da casa . Ma perché è necessaria la 'casa'?
jdurston,

2
@jdurston omettendo home non reimposterà il cursore nella parte superiore della finestra.
Hugo Zink,

1
Non funziona in Eclipse, ma funziona nel terminale Linux. Un voto per te
Anh Tuan

7
Funziona solo se l'emulatore di terminale su cui è in esecuzione Java supporta i codici di escape ANSI. Windows NT / XP / 7/8/10 CMD no
Thorbjørn Ravn Andersen,

19

Ecco come lo gestirò. Questo metodo funzionerà per il caso del sistema operativo Windows e il caso del sistema operativo Linux / Unix (il che significa che funziona anche per 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.
    }
}

Si noti che questo metodo generalmente non cancella la console se si esegue all'interno di un IDE.


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

1
@BenLeggiero Questo errore si verifica se per qualche motivo il comando cls non viene trovato da JVM all'interno di una directory dalla variabile d'ambiente PATH. Tutto questo codice fa è chiamare il comando di sistema Windows o Unix in base alla configurazione di sistema predefinita per cancellare rispettivamente il prompt dei comandi o la finestra del terminale. Dovrebbe essere esattamente come aprire una finestra del terminale e digitare "cls" seguito dal tasto Invio.
Dyndrilliac,

22
Non c'è clseseguibile in Windows. È un comando interno di cmd.exe.
a_horse_with_no_name

7
Come detto da altri, non funziona affatto , non solo perché Windows non ha eseguibili cls, ma anche perché l'output dei sottoprocessi viene reindirizzato.
Holger,

2
Questa risposta è anche un argomento su meta see: meta.stackoverflow.com/questions/308950/…
Petter Friberg,

15

Un modo per ottenere ciò può essere la stampa di più righe ("\ n") e simulare lo schermo chiaro. Alla fine cancella, al massimo nella shell unix, non rimuove il contenuto precedente, lo sposta solo verso l'alto e se fai scorrere verso il basso puoi vedere il contenuto precedente.

Ecco un codice di esempio:

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

13
Un modo più rapido per ottenere questo risultato è stampare una singola stringa di 50 \r\ncon una singola println, poiché si verifica un notevole ritardo tra le printlnchiamate.
Ben Leggiero,

7
Come fai a sapere quante linee la console è configurata per visualizzare? Potrebbe funzionare nella maggior parte dei casi, ma non tutti.
Cypher,

4
La più grande differenza tra questo e un vero clearè che in quest'ultimo, il nuovo output sarà nella parte superiore dello schermo e non nella parte inferiore.
ndm13,

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));farà il lavoro più velocemente e meglio.
Aaron Esau il

1
@AaronEsau a partire da JDK 11, è possibile utilizzareSystem.out.println(System.lineSeparator().repeat(50));
Holger il

15

Se si vuole un sistema modo più indipendente di fare questo, è possibile utilizzare la JLine biblioteca e ConsoleReader.clearScreen () . Vale la pena fare anche un controllo prudente sul fatto che JLine e ANSI siano supportati nell'ambiente attuale.

Qualcosa come il seguente codice ha funzionato per me:

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

        }
    }
}

Durante l'esecuzione, se si digita 'cancella' al prompt si cancella lo schermo. Assicurati di eseguirlo da un terminale / console adeguato e non in Eclipse.


14

Crea un metodo nella tua classe come questo: [come ha detto @Holger qui .]

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

Questo funziona almeno per Windows, non ho ancora verificato Linux. Se qualcuno lo controlla per Linux, per favore fatemi sapere se funziona (o no).

Come metodo alternativo è scrivere questo codice in 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

Non ti consiglierò di usare questo metodo.


1
funziona bene con Windows 10!
gaurav,

7

Runtime.getRuntime (). Exec (cls) NON ha funzionato sul mio laptop XP. Questo ha fatto -

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

Spero sia utile


se potessi impostare la posizione dell'indice del buffer per iniziare questo sarebbe l'unico approccio più semplice
DevilInDisguise,

1
Se il processo dovesse essere interrotto, immagino che vedresti un ritardo con alcuni print.out che vengono rimossi prima di altri.
TrevorLee,

7

Prova quanto segue:

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

Funzionerà perfettamente in ambiente Linux


2

Questo funzionerà se lo stai facendo in Bluej o altri software simili.

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

1

Puoi usare un'emulazione di clswith for (int i = 0; i < 50; ++i) System.out.println();


2
È solo un suggerimento, forse qualcuno vuole cancellare lo schermo, in realtà
Sarz,

@Sarz: e in realtà "la cancellazione dello schermo" non ha senso proprio di per sé, sia
Gyom

0

È necessario utilizzare i caratteri di controllo come barra rovesciata (\ b) e ritorno a capo (\ r). Viene disabilitato per impostazione predefinita, ma la vista Console può interpretare questi controlli.

Windows> Preferenze ed Esegui / Debug> Console e selezionare Interpreta caratteri di controllo ASCII per abilitarlo

Preferenze della console in Eclipse

Dopo queste configurazioni, puoi gestire la tua console con caratteri di controllo come:

\ t - tab.

\ b - backspace (un passo indietro nel testo o la cancellazione di un singolo carattere).

\ n - nuova riga.

\ r - ritorno a capo. ()

\ f - feed modulo.

console eclipse animazione chiara

Maggiori informazioni su: https://www.eclipse.org/eclipse/news/4.14/platform.php


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.