Comment supprimer des éléments imprimés sur la console par System.out.println ()?

Dans une application Java, j’utilise des appels à System.out.println() . Maintenant, je veux trouver un moyen de supprimer ces éléments par programmation.

Je n’ai pas trouvé de solution avec Google, donc y a-t-il des indices?

Vous pouvez imprimer le caractère de retour arrière \b autant de fois que les caractères imprimés auparavant.

 System.out.print("hello"); Thread.sleep(1000); // Just to give the user a chance to see "hello". System.out.print("\b\b\b\b\b"); System.out.print("world"); 

Note: cela ne fonctionne pas parfaitement dans la console Eclipse dans les versions antérieures à Mars (4.5). Cela fonctionne toutefois parfaitement bien dans la console de commande. Voir aussi Comment obtenir un retour arrière \ b pour travailler dans la console Eclipse?

Effacer l’écran en Java n’est pas pris en charge, mais vous pouvez essayer certaines solutions pour y parvenir.

a) Utilisez la commande OS-depend, comme ceci pour Windows:

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

b) Placez un tas de nouvelles lignes (cela fait ressortir que l’écran est clair)

c) Si vous souhaitez désactiver System.out, vous pouvez essayer ceci:

 System.setOut(new PrintStream(new OutputStream() { @Override public void write(int b) throws IOException {} })); 

Vous pouvez utiliser le curseur haut pour supprimer une ligne et effacer du texte, ou simplement remplacer l’ancien texte par un nouveau texte.

 int count = 1; System.out.print(Ssortingng.format("\033[%dA",count)); // Move up System.out.print("\033[2K"); // Erase line content 

ou écran clair

 System.out.print(Ssortingng.format("\033[2J")); 

C’est la norme, mais selon wikipedia, la console Windows ne la suit pas.

Jetez un oeil: http://www.termsys.demon.co.uk/vtansi.htm

J’utilise blueJ pour la programmation java. Il y a un moyen de vider l’écran de sa fenêtre de terminal. Essaye ça:-

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

Cela effacera tout ce qui est imprimé avant cette ligne. Mais cela ne fonctionne pas dans l’invite de commandes.

System.out est un PrintStream et en soi ne fournit aucun moyen de modifier ce qui est PrintStream . Selon ce qui sauvegarde cet object, vous pouvez ou non être en mesure de le modifier. Par exemple, si vous redirigez System.out vers un fichier journal, vous pourrez peut-être modifier ce fichier après coup. Si cela se passe directement sur une console, le texte disparaîtra dès qu’il atteindra le haut de la mémoire tampon de la console, mais il n’y a aucun moyen de le perturber par programmation.

Je ne sais pas exactement ce que vous PrintStream accomplir, mais vous pouvez envisager de créer un proxy PrintStream pour filtrer les messages au fur et à mesure de leur sortie, au lieu d’essayer de les supprimer après coup.

Pour effacer l’écran de sortie, vous pouvez simuler une personne réelle en appuyant sur CTRL + L (qui efface la sortie). Vous pouvez y parvenir en utilisant la classe Robot (), voici comment procéder:

 try { Robot robbie = new Robot(); robbie.keyPress(17); // Holds CTRL key. robbie.keyPress(76); // Holds L key. robbie.keyRelease(17); // Releases CTRL key. robbie.keyRelease(76); // Releases L key. } catch (AWTException ex) { Logger.getLogger(LoginPage.class.getName()).log(Level.SEVERE, null, ex); } 

Juste pour append à la réponse de BalusC …

L’ System.out.print("\b \b") répété de System.out.print("\b \b") avec un délai donne exactement le même comportement que lorsque nous rencontrons des backspaces dans {Console de commande Windows 7 / Java 1.6}

J’ai trouvé que dans Eclipse Mars, si vous pouvez supposer en toute sécurité que la ligne que vous remplacez sera au moins aussi longue que la ligne que vous effacez, il vous suffira d’imprimer ‘\ r’ (un retour chariot) pour Revenez au début de la ligne pour écraser les caractères que vous voyez. Je suppose que si la nouvelle ligne est plus courte, vous pouvez simplement composer les différents avec des espaces.

Cette méthode est très pratique dans éclipse pour les pourcentages de progression de la mise à jour en direct, comme dans cet extrait de code que j’ai extrait d’un de mes programmes. Cela fait partie d’un programme de téléchargement de fichiers multimédia à partir d’un site Web.

  URL url=new URL(link); HttpURLConnection connection=(HttpURLConnection)url.openConnection(); connection.connect(); if(connection.getResponseCode()!=HttpURLConnection.HTTP_OK) { throw new RuntimeException("Response "+connection.getResponseCode()+": "+connection.getResponseMessage()+" on url "+link); } long fileLength=connection.getContentLengthLong(); File newFile=new File(ROOT_DIR,link.subssortingng(link.lastIndexOf('/'))); try(InputStream input=connection.getInputStream(); OutputStream output=new FileOutputStream(newFile);) { byte[] buffer=new byte[4096]; int count=input.read(buffer); long totalRead=count; System.out.println("Writing "+url+" to "+newFile+" ("+fileLength+" bytes)"); System.out.printf("%.2f%%",((double)totalRead/(double)fileLength)*100.0); while(count!=-1) { output.write(buffer,0,count); count=input.read(buffer); totalRead+=count; System.out.printf("\r%.2f%%",((double)totalRead/(double)fileLength)*100.0); } System.out.println("\nFinished index "+INDEX); } 

Il existe deux manières différentes d’effacer le terminal dans BlueJ. BlueJ peut effacer automatiquement le terminal avant chaque appel de méthode interactif. Pour ce faire, activez l’option “Effacer l’écran à l’appel de la méthode” dans le menu “Options” du terminal. Vous pouvez également effacer le terminal par programmation de votre programme. L’impression d’un caractère de format de formulaire (Unicode 000C) efface le terminal BlueJ, par exemple:

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

J’ai trouvé une solution pour effacer la console dans un IDE Eclipse. Il utilise la classe Robot. S’il vous plaît voir le code ci-dessous et la légende pour l’explication:

  import java.awt.AWTException; import java.awt.Robot; import java.awt.event.KeyEvent; public void wipeConsole() throws AWTException{ Robot robbie = new Robot(); //shows the Console View robbie.keyPress(KeyEvent.VK_ALT); robbie.keyPress(KeyEvent.VK_SHIFT); robbie.keyPress(KeyEvent.VK_Q); robbie.keyRelease(KeyEvent.VK_ALT); robbie.keyPress(KeyEvent.VK_SHIFT); robbie.keyPress(KeyEvent.VK_Q); robbie.keyPress(KeyEvent.VK_C); robbie.keyRelease(KeyEvent.VK_C); //clears the console robbie.keyPress(KeyEvent.VK_SHIFT); robbie.keyPress(KeyEvent.VK_F10); robbie.keyRelease(KeyEvent.VK_SHIFT); robbie.keyRelease(KeyEvent.VK_F10); robbie.keyPress(KeyEvent.VK_R); robbie.keyRelease(KeyEvent.VK_R); } 

En supposant que vous n’avez pas modifié les parameters de raccourci par défaut dans Eclipse et importez ces classes Java, cela devrait fonctionner.

Les moyens les plus simples pour y parvenir seraient:

 System.out.println("\f"); System.out.println("\u000c"); 

La réponse de BalusC n’a pas fonctionné pour moi (console bash sur Ubuntu). Certaines choses sont restées au bout de la ligne. Alors je me suis retourné avec des espaces. Thread.sleep() est utilisé dans l’extrait ci-dessous pour que vous puissiez voir ce qui se passe.

 Ssortingng foo = "the quick brown fox jumped over the fence"; System.out.printf(foo); try {Thread.sleep(1000);} catch (InterruptedException e) {} System.out.printf("%s", mul("\b", foo.length())); try {Thread.sleep(1000);} catch (InterruptedException e) {} System.out.printf("%s", mul(" ", foo.length())); try {Thread.sleep(1000);} catch (InterruptedException e) {} System.out.printf("%s", mul("\b", foo.length())); 

mul est une méthode simple définie comme suit:

 private static Ssortingng mul(Ssortingng s, int n) { SsortingngBuilder builder = new SsortingngBuilder(); for (int i = 0; i < n ; i++) builder.append(s); return builder.toString(); } 

( La classe Ssortingngs de Guava fournit également une méthode de repeat similaire)

J’ai utilisé avec succès les éléments suivants:

 @Before public void dontPrintExceptions() { // get rid of the stack trace prints for expected exceptions System.setErr(new PrintStream(new NullStream())); } 

NullStream réside dans le package import com.sun.tools.internal.xjc.util donc possible qu’il ne soit pas disponible sur toutes les implémentations Java, mais il ne s’agit que d’un OutputStream , qui devrait être assez simple pour écrire le vôtre.

super collant et ne l’efface pas, mais il met juste de nouvelles lignes jusqu’à sa disparition. Ceci est juste pour le visuel, pas quelque chose de trop utile. Je suggère seulement que je l’utilisais pour de l’art ASCII et que c’était la meilleure solution.

Cela dépend aussi de la taille de la console bien sûr.

  System.out.print("Hello"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("world"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n"); System.out.print("\n");