I have a function that takes an object of a certain type, and a PrintStream to which to print, and outputs a representation of that object. How can I capture this function's output in a String? Specifically, I want to use it as in a toString method.
6 Answers
Use a ByteArrayOutputStream as a buffer:
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final String utf8 = StandardCharsets.UTF_8.name();
try (PrintStream ps = new PrintStream(baos, true, utf8)) {
yourFunction(object, ps);
}
String data = baos.toString(utf8);
5 Comments
tobr
Don't forget to close the PrintStream to free all resources.
earcam
Use
new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8); available since 1.7, it doesn't throwdimo414
@tobr certainly a good rule of thumb, but
ByteArrayOutputStream.close() "has no effect", as there are no resources to free besides the backing array which will be dealt with by the garbage collector.don't panic
ByteArrayOutputStream has toString(String charsetName), but only accept String argument. Also note that ByteArrayOutputStream is synchronized, which probably is not desirableneXus
Both the
PrintStream constructor and the baos.toString method now support the Charset objects directly, so there is no more need to convert UTF_8 to UTF_8.name() first... I recommend adding import static java.nio.charset.StandardCharsets.UTF_8; so you can use UTF_8 directly as a value.You can construct a PrintStream with a ByteArrayOutputStream passed into the constructor which you can later use to grab the text written to the PrintStream.
ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF-8");
1 Comment
Sherwin F
Note that
toString("UTF8") should be toString("UTF-8")Why don't you use a StringWriter with a PrintWriter?
StringWriter writer = new StringWriter();
PrintWriter out = new PrintWriter(writer);
out.println("Hello World!");
String output = writer.toString();
3 Comments
andrey
Apart from top rated answer this one doesn't bother you with charsetName.
Alderath
This won't work. You cannot pass the PrintWriter into a function which only takes a PrintStream as argument, which was what the question was about.
Clebert Suconic
I gave it as a suggestion on replacing the PrintStream. It's usually a good choice. If you must use a PrintStream then this i definitely not a choice. (I'm not sure why someone would vote -1 on this.. it still technically a viable option in most cases :) )
A unification of previous answers, this answer works with Java 1.7 and after. Also, I added code to close the Streams.
final Charset charset = StandardCharsets.UTF_8;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos, true, charset.name());
yourFunction(object, ps);
String content = new String(baos.toByteArray(), charset);
ps.close();
baos.close();
Comments
Maybe this question might help you: Get an OutputStream into a String
Subclass OutputStream and wrap it in PrintStream