When should I use Java's StringWriter?

21.3k views Asked by At

What is a Java StringWriter, and when should I use it?

I have read the documentation and looked here, but I do not understand when I should use it.

2

There are 2 answers

3
JaskeyLam On

It is a specialized Writer that writes characters to a StringBuffer, and then we use method like toString() to get the string result.

When StringWriter is used is that you want to write to a string, but the API is expecting a Writer or a Stream. It is a compromised, you use StringWriter only when you have to, since StringBuffer/StringBuilder to write characters is much more natural and easier,which should be your first choice.

Here is two of a typical good case to use StringWriter

1.Converts the stack trace into String, so that we can log it easily.

StringWriter sw = new StringWriter();//create a StringWriter
PrintWriter pw = new PrintWriter(sw);//create a PrintWriter using this string writer instance
t.printStackTrace(pw);//print the stack trace to the print writer(it wraps the string writer sw)
String s=sw.toString(); // we can now have the stack trace as a string

2.Another case will be when we need to copy from an InputStream to chars on a Writer so that we can get String later, using Apache commons IOUtils#copy :

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);//copy the stream into the StringWriter
String result = writer.toString();
1
RossBille On

It is used to construct a string char-by-char or string-by-string.

It is similar to StringBuilder but uses a StringBuffer under the hood. This is preferable when you are working with an API that requires a stream or writer. If you don't have this requirement it should be more efficient to use a StringBuilder (due to the synchronisation overhead of StringBuffer).

Of course this only makes sense if you realise that string concatenation (eg.

String s = "abc"+"def"; //... (especially when spread throughout a loop)` 

is a slow operation (see here).

small e.g.

StringWriter writer = new StringWriter();
writer.write('t');
writer.write("his awesome");
String result = writer.toString();
System.out.println(result); //outputs this is awesome

A better example:

String[] strings = /* some array of strings*/
StringWriter writer = new StringWriter();
for(String s : strings){
    writer.write(s);
}    
String result = writer.toString();
System.out.println(result);