Ottieni un OutputStream in una stringa

Qual è il modo migliore per redirect l’output da un java.io.OutputStream a una stringa in Java?

Dì che ho il metodo:

writeToStream(Object o, OutputStream out) 

Che scrive determinati dati dall’object allo stream specificato. Tuttavia, voglio ottenere questo risultato in una stringa il più facilmente ansible.

Sto pensando di scrivere una class come questa (non testata):

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

Ma c’è un modo migliore? Voglio solo eseguire un test!

Vorrei utilizzare un ByteArrayOutputStream . E alla fine puoi chiamare:

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

o meglio

 baos.toString( codepage ); 

Per il costruttore String la codepage può essere una stringa o un’istanza di java.nio.charset.Charset . Un ansible valore è java.nio.charset.StandardCharsets.UTF_8 .

Il metodo toString accetta solo una stringa come parametro codepage (stand Java 8).

Mi piace la libreria IO di Apache Commons. Dai un’occhiata alla sua versione di ByteArrayOutputStream , che ha un metodo toString(String enc) e toByteArray() . L’utilizzo di componenti esistenti e affidabili come il progetto Commons consente di estendere e riutilizzare il codice in modo più semplice e più semplice. In bocca al lupo.

Questo ha funzionato bene

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

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

quindi per stampare la stringa o farla semplicemente fare riferimento al stream “output” stesso Come esempio, per stampare la stringa su console = >> System.out.println(output);

Cordiali saluti: la mia chiamata al metodo marshaller.marshal(Object,Outputstream) serve per lavorare con XML. È irrilevante per questo argomento.

Questo è molto dispendioso per l’uso in produzione, c’è troppa conversione ed è un po ‘lento. Questo è stato appena codificato per dimostrarti che è totalmente ansible creare un OuputStream personalizzato e generare una stringa. Ma vai su Horcrux7 e tutto va bene con solo due chiamate di metodo.

E il mondo vive in un altro giorno ….

Ecco cosa ho finito per fare:

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

Dove os è un ByteArrayOutputStream .

Perché non usi un ByteArrayOutputStream ? Questo è quello che dovresti usare per questo scopo.