StringOutputStream backed by ByteArrayOutputStream

The other day I needed to read output stream directly into a string, but JDK does not provides us with a stream directly for that. There have been numerous discussions on why and why not we should have this build into the JDK, but this was a case where I did need it and knew the encoding.

My implementation

StringOutputStream backed by ByteArrayOutputStream that simplifies reading of OutputStream directly into string.

 
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
 
/**
 * StringOutputStream backed by ByteArrayOutputStream that simplifies  reading of {@link OutputStream}  directly into string
 * @author Grzegorz Bugaj
 *
 */
public class StringOutputStream extends OutputStream{
	private ByteArrayOutputStream buffer = new ByteArrayOutputStream();
	private static final Charset DEFAULT_CHARACTER_SET = Charset.forName("UTF-8");
	private Charset characterSet;
 
	@Override
	public void write(int b) throws IOException {
		buffer.write(b);
	}
 
	@Override
	public void write(byte[] b) throws IOException {
		buffer.write(b);
	}
 
	@Override
	public void write(byte[] b, int off, int len) throws IOException {
		buffer.write(b, off, len);
	}
 
	/**
	 * Get currently set character set if none set default charset of UTF-8 will be used
	 * @return Charaset 
	 */
	public Charset getCharacterSet() {
		if(characterSet == null)
			return DEFAULT_CHARACTER_SET;
 
		return characterSet;
	}
 
	public void setCharacterSet(Charset characterSet) {
		this.characterSet = characterSet;
	}
 
 
	@Override
	public String toString() {
		return new String(buffer.toByteArray(), getCharacterSet());
	}
}

Usage Example

	/**
	 * Read in given stream into a string
	 * @param stream
	 * @return
	 */
	public static String readAsString(InputStream stream) throws IOException{
		OutputStream sos = new StringOutputStream(); 		
		// Set chunk size to 64K chunk
		byte[] buffer = new byte[0x10000];
		int readLen;
		while((readLen = stream.read(buffer, 0, buffer.length)) != -1){
			sos.write(buffer, 0, readLen);
		}
		return sos.toString();
	}

Leave a Comment

Your email address will not be published. Required fields are marked *