Monday, June 11, 2012

Get an OutputStream into a String

What's the best way to pipe the output from an to a String in Java?

Say I have the method:

writeToStream(Object o, OutputStream out)

Which writes certain data from the object to the given stream. However, I want to get this output into a String as easily as possible.

I'm considering writing a class like this (untested):

class StringOutputStream extends OutputStream {

StringBuilder mBuf;

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

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

But is there a better way? I only want to run a test!

Source: Tips4all


  1. I would use a ByteArrayOutputStream. And on finish you can call:

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

    or better

    baos.toString( codepage );

  2. I like the Apache Commons IO library. Take a look at its version of ByteArrayOutputStream, which has a toString(String enc) method as well as toByteArray() . Using existing and trusted components like the Commons project lets your code be smaller and easier to extend and repurpose. Good luck.

  3. this worked nicely

    OutputStream output = new OutputStream()
    private StringBuilder string = new StringBuilder();
    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();

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

    then to print the string or get it just reference the "output" stream itself
    As an example, to print the string out to console =>> System.out.println(output);

    FYI: my method call marshaller.marshal(Object,Outputstream) is for working with xml. It is irrelevant to this topic.

    This is higly wasteful for productional use, there are way to many conversion and it is a bit loose. This was just coded to prove to you that it is totally possible to create a custom OuputStream and output a string. But just go Horcrux7 way and all is good with merely two method calls.

    And the world lives on another day....

  4. Here's what I ended up doing:

    Obj.writeToStream(toWrite, os);
    try {
    String out = new String(os.toByteArray(), "UTF-8");
    } catch (UnsupportedEncondingException e) {
    fail("Caught exception: " + e.getMessage());

    Where os is a ByteArrayOutputStream.

  5. From what you describe I would suggest having a look at It collects in a StringBuffer which you can then convert to a String when you need it.