Writer或OutputStream?

时间:2011-03-07 18:47:06

标签: java

我正在设计一个库,其中一个类应该能够将自己的内部转换为文本。我应该使用哪个班级:OutputStreamWriter?它们之间的关键区别是什么(在我的情况下)?

public interface Memento {
  void save(OutputStream stream);
  void save(Writer writer);
}

哪一个?

3 个答案:

答案 0 :(得分:28)

OutputStream是面向字节的流。您编写的任何文本都必须使用某种编码(最常见的ISO-8859-1或UTF-8)编码为字节。 Writer是一个面向字符的流,可能会也可能不会将字符内部编码为字节,具体取决于它写入的内容。

编辑如果你正在设计一个库,那么如果你提供一个面向OutputStream的接口来写入文本,你真的应该为客户端类提供控制它的能力。要使用的编码。

答案 1 :(得分:17)

文本? Writer。它用于处理字符,荣誉编码。

流/字节数组? OutputStream。适用于原始字节,没有字符,编码,字符串等概念。

答案 2 :(得分:0)

1)在许多情况下,最好重写[em> toString()或提供类似的方法将内部结构转换为文本。使用此方法的用户的优势灵活性。例如,如果这种方法的使用者可以:

  • 将其作为POJO的一部分保存到数据库中
  • 将其作为字段合并到某些JSON对象中
  • 保存到
  • 将其保存到 writer

在某些情况下可能是不利的,例如当文本表示形式相对较大(例如100 MB)并且同时有许多请求产生此类对象时。这可能需要过多的资源(CPU,RAM)。在这种情况下,直接写入流或写入者可能是更好的选择。

2)如果您希望对象可以在许多不同的上下文中使用,那么提供两者,保存到流并保存到编写器是很有意义的。例如, HttpServletResponse 同时提供 getWriter() getOutputStream(),这样每个人都可以决定在自己的特定情况下哪个更好。或Jackson的JsonFactory File OutputStream Writer 提供了* createGenerator()*方法,给了消费者很大的自由度。