2010-10-08 7 views
3

J'utilise une bibliothèque externe. Lorsque vous appelez une méthode de cette bibliothèque, elle affiche du texte sur la console. Je veux cacher ce texte de la console. Comment est-ce possible?Masquer la sortie Java

Merci à l'avance

+2

Utilisez une bibliothèque qui a été écrit mieux. Les bibliothèques tierces ne doivent jamais écrire directement sur la console. –

+0

... ou consultez la documentation de la bibliothèque. Peut-être qu'il comprend une fonction ou un moyen de le désactiver. – Adonais

+0

Êtes-vous sûr de ne pas confondre les appels stdout "clairs" avec les appels de logger comme log4j/util.Logging/slf4j/etc? Sinon, il suffirait de configurer correctement l'enregistreur. De quelle bibliothèque s'agit-il? – BalusC

Répondre

5

Vous pouvez redéfinir system.out (je crois qu'il est System.setOut()) Je crois que vous pouvez le mettre à NULL (corrigée - vous ne pouvez pas définir à NULL), mais vous pouvez le définir sur n'importe quel flux de sortie.

J'ai fait quelque chose d'intéressant avec cette fois. J'ai sauvé "System.out" puis l'ai redirigé vers mon propre flux de sortie avec du code dans la méthode "print" - cette méthode est appelée chaque fois que quelqu'un imprime dans le flux.

Chaque fois qu'une ligne d'entrée est entrée dans cette classe, je crée une trace de pile, récupère la trace et déterre la méthode qui a appelé la méthode System.out.println(). À ce stade, je pourrais ajouter la ligne et avoir la fonctionnalité de l'enregistreur instantané - il montre même le numéro de ligne.

Ceci était probablement assez lent mais il pouvait être allumé et éteint très facilement.

Je pourrais également faire tout le filtrage que vous souhaitez sans toucher au code source. Parfois, je filtrais sur un seul paquet, parfois je filtrais sur une classe et parfois ce sont des chaînes commençant par "BK:" qui n'impriment que mes messages.

Dans l'ensemble, il était très amusant et trivial de supprimer toutes les sorties de débogage pour la production.

(Je ne recommande pas la chose trace de la pile get pour le code de production, il devrait vraiment être tout à fait même lent que je n'ai pas remarqué)

// class variable 
public static final OutputStream out; 

{ 
    out=System.getOutputStream();// I may have the actual name wrong, but it's close 
    System.setOutputStream(new OutputStreamThatDoesNothing()); 
} 

à ce point tous les appels à:

Redirect.out("Hello"); 

Devrait agir comme les appels à System.out.

Comme il n'y a pas de magie avec cela, vous pouvez également faire quelque chose comme ça si vous voulez vraiment:

OutputStream tmp=System.getOutputStream(); 
System.setOutpuatStream(nullStream); 
callOffensiveLibraryMethod(); 
System.setOutputStream(tmp); 

Ce serait seulement d'éliminer sortie dans cet appel, mais serait très mauvais si votre demande a été plusieurs -filée.

+0

Vous ne pouvez pas le définir sur null. Il provoquera NullPointerException lorsqu'une fonction System.out.print() est appelée.Mais vous pouvez utiliser un autre flux de sortie. – Adonais

+0

seul problème avec cette méthode est qu'il redirigera également la sortie de mon propre code vers le flux d'impression défini – Novice

+1

Vous pouvez toujours imprimer sur la sortie "original". –

2

Définissez le System.out sur un NullOutputStream. apacahe.commons en a un disponible.

Si vous voulez l'imprimer en conséquence, vous pouvez écrire un hack amusant.

private static final PrintStream SYSTEM_OUT = System.out(); 

public static void debug(String debug){ 
    SYSTEM_OUT.println(debug); 
} 

somehwere autre dans le code

System.setOut(new PrintStream(new NullOutputStream())); 
3
private PrintStream realSystemOut = System.out; 
private static class NullOutputStream extends OutputStream { 
    @Override 
    public void write(int b){ 
     return; 
    } 
    @Override 
    public void write(byte[] b){ 
     return; 
    } 
    @Override 
    public void write(byte[] b, int off, int len){ 
     return; 
    } 
    public NullOutputStream(){ 
    } 
} 
void someMethod(){ 
    System.setOut(new PrintStream(new NullOutputStream()); 
    realSystemOut.println("Hello World!"); //prints Hello World! 
    System.out.println("Hello World!"); //nothing! 
    System.setOut(realSystemOut); 
    System.out.println("Hello World!"); //prints Hello World! 
}