it-swarm.com.de

Holen Sie sich einen OutputStream in einen String

Wie kann die Ausgabe eines Java.io.OutputStream-Objekts am besten an einen String in Java weitergeleitet werden?

Angenommen, ich habe die Methode:

  writeToStream(Object o, OutputStream out)

Welche schreibt bestimmte Daten aus dem Objekt in den angegebenen Stream. Ich möchte diese Ausgabe jedoch so einfach wie möglich in einen String umwandeln.

Ich denke darüber nach, eine Klasse wie diese zu schreiben (ungetestet):

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 durchführen!

550
Adrian Mouat

Ich würde ein ByteArrayOutputStream verwenden. Und im Ziel können Sie anrufen:

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

oder besser:

baos.toString( codepage );

Für den Konstruktor String kann 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 String als codepage -Parameter (Stand Java 8).

582
Horcrux7

Ich mag die Apache Commons IO Bibliothek. Schauen Sie sich die Version von ByteArrayOutputStream an, die eine toString(String enc) -Methode sowie toByteArray() enthält. Wenn Sie vorhandene und vertrauenswürdige Komponenten wie das Commons-Projekt verwenden, wird Ihr Code kleiner und lässt sich leichter erweitern und neu verwenden.

44
Joe Liversedge

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

um dann die Zeichenfolge zu drucken oder sie abzurufen, verweisen Sie einfach auf den "Ausgabe" -Stream selbst. Als Beispiel, um die Zeichenfolge an console auszudrucken = >> System.out.println(output);

Zu Ihrer Information: Mein Methodenaufruf marshaller.marshal(Object,Outputstream) dient zum Arbeiten mit XML. Es ist für dieses Thema irrelevant.

Dies ist sehr verschwenderisch für den produktiven Einsatz, es gibt viel zu viele Konvertierungen und es ist ein bisschen locker. Dies wurde nur codiert, um Ihnen zu beweisen, dass es durchaus möglich ist, einen benutzerdefinierten OuputStream zu erstellen und einen String auszugeben. Aber gehen Sie einfach Horcrux7 Weg und alles ist gut mit nur zwei Methodenaufrufen.

Und die Welt lebt an einem anderen Tag ...

23
alcardenas

Folgendes habe ich letztendlich getan:

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

Wobei os ein ByteArrayOutputStream ist.

14
Adrian Mouat