我正在设计一个库,其中一个类应该能够将自己的内部转换为文本。我应该使用哪个类:OutputStream
还是Writer
?针对我的情况,它们之间的关键区别是什么?
public interface Memento {
void save(OutputStream stream);
void save(Writer writer);
}
哪一个?
我正在设计一个库,其中一个类应该能够将自己的内部转换为文本。我应该使用哪个类:OutputStream
还是Writer
?针对我的情况,它们之间的关键区别是什么?
public interface Memento {
void save(OutputStream stream);
void save(Writer writer);
}
哪一个?
OutputStream
(输出流)是一个面向字节的流。写入的任何文本都必须使用某种编码(最常见的是ISO-8859-1或UTF-8)转换为字节。而Writer
(写入器)则是一个面向字符的流,根据它所写入的内容会不会内部将字符编码为字节来进行区分。
编辑:如果您正在设计库,则如果您提供了一个基于OutputStream
的接口来进行文本写入,那么您应该为客户端类提供控制要使用的编码的功能。
文本?Writer
。它用于处理字符并支持编码。
字节流/数组?OutputStream
。它处理原始的字节数据,不涉及字符、编码、字符串等概念。
OutputStreamWriter
是什么?它用于将字节转换为字符集吗? - Asif MushtaqOutputStreamWriter
是一个使用 OutputStream
作为目标的 Writer
。在写入文本时,它将使用构造 OutputStreamWriter
时指定的编码(或取决于平台的默认编码)将字符转换为字节。要将字节转换为字符,您可以使用 Reader
。 - Ted Hopp1) 在许多情况下,最好的方法是重写toString()或提供类似的方法将内部转换为文本。这种方法对用户的优点是灵活性。例如,如果使用此方法的消费者可以:
在某些情况下,这可能是不利的,例如当文本表示相对较大(如100 MB)且同时产生此类对象的请求很多时。这可能需要太多资源(CPU,RAM)。在这种情况下,直接写入流或写入writer可能更可取。
2) 如果您期望您的对象可以在许多不同的上下文中使用,那么提供两者,即保存到流和保存到写入器是有意义的。例如,HttpServletResponse 提供了 getWriter() 和 getOutputStream() 两种方法,以便每个人都可以决定在他特定的情况下哪种更好。或者像 Jackson 的 JsonFactory 提供了 * createGenerator()* 方法,用于 File、OutputStream 和 Writer,为消费者提供了很大的自由度。