Erhalte einen OutputStream in einen String

Was ist der beste Weg, die Ausgabe von einem java.io.OutputStream zu einem String in Java zu pipen?

Sag, ich habe die Methode:

writeToStream(Object o, OutputStream out) 

Das schreibt bestimmte Daten vom Objekt in den gegebenen Stream. Allerdings möchte ich diese Ausgabe so einfach wie möglich in einen String bekommen.

Ich überlege, eine solche class zu schreiben (ungeprüft):

 class StringOutputStream extends OutputStream { StringBuilder mBuf; public void write(int byte) throws IOException { mBuf.append((char) byte); } public String getString() { return mBuf.toString(); } } 

Aber gibt es einen besseren Weg? Ich möchte nur einen Test machen!

Ich würde einen ByteArrayOutputStream . Und am Ende können Sie anrufen:

 new String( baos.toByteArray(), codepage ); 

oder besser

 baos.toString( codepage ); 

Für den String-Konstruktor kann die codepage ein String oder eine Instanz von java.nio.charset.Charset sein . Ein möglicher Wert ist java.nio.charset.StandardCharsets.UTF_8 .

Die Methode toString akzeptiert nur einen String als codepage Parameter (Stand Java 8).

Ich mag die Apache Commons IO-Bibliothek. Sehen Sie sich die Version von ByteArrayOutputStream an , die sowohl eine toString(String enc) -Methode als auch toByteArray() . Durch die Verwendung vorhandener und vertrauenswürdiger Komponenten wie dem Commons-Projekt kann Ihr Code kleiner und leichter erweitert und wiederverwendet werden. Viel Glück.

Das hat gut funktioniert

  OutputStream output = new OutputStream() { private StringBuilder string = new StringBuilder(); @Override public void write(int b) throws IOException { this.string.append((char) b ); } //Netbeans IDE automatically overrides this toString() public String toString(){ return this.string.toString(); } }; 

Methodenaufruf = >> marshaller.marshal( (Object) toWrite , (OutputStream) output);

dann, um die Zeichenkette zu drucken oder es nur Bezug auf den “Ausgabe” -Strom selbst zu bekommen, als Beispiel, um die Zeichenkette heraus zu drucken, um Konsole = >> System.out.println(output);

FYI: Meine Methode Aufruf marshaller.marshal(Object,Outputstream) ist für die Arbeit mit XML. Es ist für dieses Thema irrelevant.

Dies ist sehr verschwenderisch für die Produktion, es gibt eine viel zu viel Umwandlung und es ist ein bisschen locker. Dies wurde nur codiert, um Ihnen zu beweisen, dass es absolut möglich ist, einen benutzerdefinierten OuputStream zu erstellen und einen String auszugeben. Aber geh einfach auf Horcrux7 Weise und alles ist gut mit nur zwei Methodenaufrufen.

Und die Welt lebt an einem anderen Tag ….

Hier ist, was ich getan habe:

 Obj.writeToStream(toWrite, os); try { String out = new String(os.toByteArray(), "UTF-8"); assertTrue(out.contains("testString")); } catch (UnsupportedEncondingException e) { fail("Caught exception: " + e.getMessage()); } 

Wo ist os ein ByteArrayOutputStream .

Warum verwendest du keinen ByteArrayOutputStream ? Das sollten Sie für diesen Zweck verwenden.