When should I use Java's StringWriter? [closed]
Asked Answered
E

2

15

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.

Eureka answered 1/12, 2014 at 3:31 Comment(5)
Maybe this would be useful for other people to know.Eureka
All people can simply search for StringWriter javadoc.Plenish
What part of 'A character stream that collects its output in a string buffer, which can then be used to construct a string' don't you understand?Norm
Thank you for all of the answers! They are all exceptionally useful! Especially, I would like to thank the people who answered for giving examples of usage that one cannot simply find in the documentation, such as @RossBille 's explanation of its usage in concatenation optimization, and Jaskey's explanation of its usage in printing stacktraces.Eureka
@Eureka , please accept one of the answers if it answers your question and helps you. And next time, you should ask question with a more meaningful title with a narrow scope after you search some similar question on SO, so that nobody downvotes.Portingale
P
32

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();
Portingale answered 1/12, 2014 at 3:52 Comment(3)
A lot of your explanation was already covered in my answerEncounter
@Encounter , you give a good explaination but with a bad example in which we should not choose StringWriter actually. Besides, I don't think we should call it similar to StringBuffer/StringBuilder, it is more like a adapter which deals with stream/writer cases , this should only be should when we have no other choices.Portingale
What is t? This code doesn't compile.Muzhik
E
7

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);
Encounter answered 1/12, 2014 at 3:36 Comment(1)
I will use StringBuffer/StringBuilder instead of StringWriter for your case.Portingale

© 2022 - 2024 — McMap. All rights reserved.