Pregunta

¿Cuál es la mejor manera de canalizar la salida de un java.io.OutputStream a una cadena en Java?

Di que tengo el método:

  writeToStream(Object o, OutputStream out)

Que escribe ciertos datos del objeto en el flujo dado. Sin embargo, quiero obtener esta salida en una cadena lo más fácilmente posible.

Estoy considerando escribir una clase como esta (sin probar):

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

  public void write(int byte) throws IOException {
    mBuf.append((char) byte);
  }

  public String getString() {
    return mBuf.toString();
  }
}

¿Pero hay una mejor manera? ¡Sólo quiero hacer una prueba!

¿Fue útil?

Solución

Yo usaría un ByteArrayOutputStream . Y al finalizar puedes llamar:

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

o mejor

baos.toString( codepage );

Para el constructor de cadenas, codepage puede ser una cadena o una instancia de java.nio.charset.Charset . Un valor posible es java.nio.charset .StandardCharsets.UTF_8 .

El método toString solo acepta una cadena como parámetro codepage (stand Java 8).

Otros consejos

Me gusta la biblioteca IO de Apache Commons. Eche un vistazo a su versión de ByteArrayOutputStream , que tiene un método toString (String enc) así como toByteArray () . El uso de componentes existentes y de confianza, como el proyecto Commons, permite que su código sea más pequeño y más fácil de extender y reutilizar.

Esto funcionó muy bien

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

llamada al método = > > marshaller.marshal ((Object) toWrite, (OutputStream) output);

luego, para imprimir la cadena o para obtenerla, simplemente haga referencia a la salida " transmisión en sí mismo Como ejemplo, para imprimir la cadena en la consola = > > System.out.println(output);

Para tu información: mi llamada al método marshaller.marshal (Object, Outputstream) es para trabajar con XML. Es irrelevante para este tema.

Esto es un gran desperdicio para el uso de producción, hay demasiadas conversiones y está un poco suelto. Esto solo se codificó para demostrarle que es totalmente posible crear un OuputStream personalizado y generar una cadena. Pero vaya por Horcrux7 y todo está bien con solo dos llamadas de método.

Y el mundo vive en otro día ....

Esto es lo que terminé haciendo:

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

Donde os es un ByteArrayOutputStream .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top