Monday, June 11, 2012

Get an OutputStream into a String


What's the best way to pipe the output from an java.io.OutputStream 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

5 comments:

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

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


    or better

    baos.toString( codepage );

    ReplyDelete
  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.

    ReplyDelete
  3. this worked nicely

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


    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....

    ReplyDelete
  4. Here's what I ended up doing:

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


    Where os is a ByteArrayOutputStream.

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

    http://java.sun.com/j2se/1.5.0/docs/api/java/io/StringWriter.html

    ReplyDelete