问题
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.
回答1:
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();
回答2:
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);
来源:https://stackoverflow.com/questions/27221292/when-should-i-use-javas-stringwriter