Java: PrintStream en chaîne?

115

J'ai une fonction qui prend un objet d'un certain type, et un PrintStreamsur lequel imprimer, et génère une représentation de cet objet. Comment puis-je capturer la sortie de cette fonction dans une chaîne? Plus précisément, je veux l'utiliser comme une toStringméthode.

Nick Heiner
la source

Réponses:

193

Utilisez a ByteArrayOutputStreamcomme tampon:

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final String utf8 = StandardCharsets.UTF_8.name();
    try (PrintStream ps = new PrintStream(baos, true, utf8)) {
        yourFunction(object, ps);
    }
    String data = baos.toString(utf8);
ChssPly76
la source
10
N'oubliez pas de fermer PrintStream pour libérer toutes les ressources.
tobr
9
Je suggérerais d'utiliser PrintStream ps = new PrintStream(baos,true,"utf-8");pour éviter le chaos de charset
Dr. Max Völkel
5
Utilisation new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);disponible depuis la 1.7 , ça ne jette pas
earcam
2
@tobr est certainement une bonne règle de base, mais ByteArrayOutputStream.close()" n'a aucun effet ", car il n'y a pas de ressources à libérer en plus du tableau de sauvegarde qui sera traité par le ramasse-miettes.
dimo414
ByteArrayOutputStreama toString(String charsetName), mais n'accepte que l'argument String. Notez également que ByteArrayOutputStream est synchronisé , ce qui n'est probablement pas souhaitable
ne paniquez pas le
31

Vous pouvez construire un PrintStream avec un ByteArrayOutputStream passé dans le constructeur que vous pourrez utiliser ultérieurement pour récupérer le texte écrit dans PrintStream.

ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");
Asaph
la source
5

Une unification des réponses précédentes, cette réponse fonctionne avec Java 1.7 et après. De plus, j'ai ajouté du code pour fermer les Streams.

final Charset charset = StandardCharsets.UTF_8;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos, true, charset.name());
yourFunction(object, ps);
String content = new String(baos.toByteArray(), charset);
ps.close();
baos.close();
Kaelan Dawnstar
la source
-3

Définissez et initialisez une variable Scanner nommée inSS qui crée un flux de chaîne d'entrée à l'aide de la variable String myStrLine.

Ans: Scanner inSS = nouveau scanner (myStrLine);

user7805633
la source