Domanda

Qual è il modo migliore per convogliare l'output da java.io.OutputStream a una stringa in Java?

Dire che ho il metodo:

  writeToStream(Object o, OutputStream out)

Che scrive determinati dati dall'oggetto nel flusso dato. Tuttavia, voglio ottenere questo output in una stringa il più facilmente possibile.

Sto pensando di scrivere una lezione 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!

È stato utile?

Soluzione

Vorrei usare un ByteArrayOutputStream . E alla fine puoi chiamare:

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

o migliore

baos.toString( codepage );

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

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

Altri suggerimenti

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'uso di componenti esistenti e affidabili come il progetto Commons consente di ridurre e semplificare il codice in modo che sia più piccolo e più semplice da estendere e riutilizzare.

Funzionava 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 ottenerla basta fare riferimento a " output " flusso stesso Ad esempio, per stampare la stringa su console = > > System.out.println (output);

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

Questo è altamente dispendioso per l'uso produttivo, c'è troppa conversione ed è un po 'lento. Questo è stato appena codificato per dimostrarti che è assolutamente possibile creare un OuputStream personalizzato e generare una stringa. Ma segui 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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top