Writer 还是 OutputStream?

32

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

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

哪一个?


4
作家/读者处理字符数据,而流处理二进制数据。 - asgs
@asgs 一句简单的话解决了我的疑惑。谢谢哈哈。 - user5228393
3个回答

41

OutputStream(输出流)是一个面向字节的流。写入的任何文本都必须使用某种编码(最常见的是ISO-8859-1或UTF-8)转换为字节。而Writer(写入器)则是一个面向字符的流,根据它所写入的内容会不会内部将字符编码为字节来进行区分。

编辑:如果您正在设计库,则如果您提供了一个基于OutputStream的接口来进行文本写入,那么您应该为客户端类提供控制要使用的编码的功能。


21

文本?Writer。它用于处理字符并支持编码。

字节流/数组?OutputStream。它处理原始的字节数据,不涉及字符、编码、字符串等概念。


OutputStreamWriter是什么?它用于将字节转换为字符集吗? - Asif Mushtaq
2
@UnKnown - OutputStreamWriter 是一个使用 OutputStream 作为目标的 Writer。在写入文本时,它将使用构造 OutputStreamWriter 时指定的编码(或取决于平台的默认编码)将字符转换为字节。要将字节转换为字符,您可以使用 Reader - Ted Hopp

0

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

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

在某些情况下,这可能是不利的,例如当文本表示相对较大(如100 MB)且同时产生此类对象的请求很多时。这可能需要太多资源(CPU,RAM)。在这种情况下,直接写入流或写入writer可能更可取。

2) 如果您期望您的对象可以在许多不同的上下文中使用,那么提供两者,即保存到流和保存到写入器是有意义的。例如,HttpServletResponse 提供了 getWriter()getOutputStream() 两种方法,以便每个人都可以决定在他特定的情况下哪种更好。或者像 Jackson 的 JsonFactory 提供了 * createGenerator()* 方法,用于 FileOutputStreamWriter,为消费者提供了很大的自由度。


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