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.

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);

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");

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();


-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);

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.