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.