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
I would use a ByteArrayOutputStream. And on finish you can call:
ReplyDeletenew String( baos.toByteArray(), codepage );
or better
baos.toString( codepage );
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.
ReplyDeletethis worked nicely
ReplyDeleteOutputStream 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....
Here's what I ended up doing:
ReplyDeleteObj.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.
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.
ReplyDeletehttp://java.sun.com/j2se/1.5.0/docs/api/java/io/StringWriter.html