何时应使用Java的StringWriter?

14

什么是Java的StringWriter,何时应该使用它?

我已经阅读了文档并查看了这里,但我不明白在何时应该使用它。


3
也许其他人知道这个会有用。 - MarkusWillson
3
任何人都可以简单地搜索“StringWriter javadoc”。 - Sotirios Delimanolis
3
你不理解的是“将输出收集到字符串缓冲区中的字符流,然后可以使用它来构造字符串”的部分。 - user207421
1
感谢所有的回答!它们都非常有用!特别是,我要感谢那些提供了使用示例的人,这些示例在文档中无法找到,比如@RossBille在连接优化中使用的解释,以及Jaskey在打印堆栈跟踪时使用的解释。 - MarkusWillson
@MarkusWillson,请接受其中一个答案,如果它回答了你的问题并帮助到了你。下次在 SO 上提问时,请使用更有意义、范围更窄的标题,并在搜索一些类似的问题后再提问,这样就不会被人踩了。 - JaskeyLam
2个回答

31

这是一个专门将字符写入 StringBuffer 的特殊 Writer,然后我们使用像 toString() 这样的方法来获取字符串结果。

当希望向字符串中写入内容,但 API 需要 WriterStream 时,可以使用 StringWriter。这是一种妥协,只有在必须时才使用 StringWriter,因为使用 StringBuffer/StringBuilder 编写字符更自然、更容易,应该是首选。

以下是两种典型的使用 StringWriter 的好例子:

1.将堆栈跟踪转换为 String,以便轻松记录日志。

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.另一种情况是当我们需要从一个InputStream复制到Writer上的字符,以便稍后可以使用Apache commons IOUtils#copy获取String

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

你的很多解释已经在我的回答中涉及到了。 - RossBille
1
@RossBille,你的解释很好,但是举的例子不太恰当。我们实际上不应该选择StringWriter。此外,我认为我们不应该把它称为类似于StringBuffer/StringBuilder,它更像是一个适配器,处理流/写入器的情况,只有在没有其他选择时才应该使用它。 - JaskeyLam
t是什么?这段代码无法编译。 - undefined

7

它用于构建一个char-by-charstring-by-string的字符串。

它类似于StringBuilder,但在底层使用StringBuffer。当你使用需要流或写入器(stream or writer)的API时,这是首选。如果你没有此要求,则使用StringBuilder应该更有效率(由于StringBuffer的同步开销)。

当然,这只有在你意识到字符串连接(例如

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

这是一个缓慢的操作(参见此处)。

小例子:

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

一个更好的例子:
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);

2
我会针对你的情况使用StringBuffer/StringBuilder而不是StringWriter。 - JaskeyLam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接