Frage

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

Sagen, ich habe die Methode:

  writeToStream(Object o, OutputStream out)

Welche bestimmte Daten aus dem Objekt in dem angegebenen Stream schreibt. Allerdings möchte ich diese Ausgabe in einen String bekommen so einfach wie möglich.

Ich erwäge eine Klasse wie das 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 laufen!

War es hilfreich?

Lösung

Ich möchte einen ByteArrayOutputStream verwenden. Und am Ziel können Sie anrufen:

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

oder besser

baos.toString( codepage );

Für das String-Konstruktor kann der codepage einen String oder eine Instanz von java.nio.charset.Charset . Ein möglicher Wert ist java.nio.charset .StandardCharsets.UTF_8 .

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

Andere Tipps

Ich mag die Apache Commons IO-Bibliothek. Werfen Sie einen Blick auf seine Version von ByteArrayOutputStream , die ein toString(String enc) Verfahren sowie toByteArray() hat. Die Nutzung vorhandener und vertrauenswürdige Komponenten wie die Commons-Projekt können Sie den Code kleiner und leichter zu erweitern und wiederzuverwenden.

Das funktionierte gut

    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 die Zeichenfolge drucken oder einfach den „Ausgang“ Referenz bekommen selbst streamen Als Beispiel der Zeichenfolge, um Konsole zu drucken = >> System.out.println(output);

Zur Info: mein Methodenaufruf marshaller.marshal(Object,Outputstream) ist für die Arbeit mit XML. Dabei ist es unerheblich zu diesem Thema.

Dies ist für den produktiven Einsatz sehr verschwenderisch ist, gibt es eine Möglichkeit, zu viele Umwandlung und es ist ein bisschen locker. Dies wurde nur codiert, Ihnen zu beweisen, dass es durchaus möglich ist, eine benutzerdefinierte OuputStream und Ausgabe einer Zeichenfolge zu erstellen. Aber gehen Sie einfach Horcrux7 Weg und alles ist gut mit lediglich zwei Methodenaufrufe.

Und die Welt lebt an einem anderen Tag ....

Hier ist, was ich am Ende tun:

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 os ist ein ByteArrayOutputStream.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top