我正在设计一个库,其中一个类应该能够将自己的内部转换为文本。我应该使用哪个班级:OutputStream
或Writer
?它们之间的关键区别是什么(在我的情况下)?
public interface Memento {
void save(OutputStream stream);
void save(Writer writer);
}
哪一个?
答案 0 :(得分:28)
OutputStream
是面向字节的流。您编写的任何文本都必须使用某种编码(最常见的ISO-8859-1或UTF-8)编码为字节。 Writer
是一个面向字符的流,可能会也可能不会将字符内部编码为字节,具体取决于它写入的内容。
编辑如果你正在设计一个库,那么如果你提供一个面向OutputStream
的接口来写入文本,你真的应该为客户端类提供控制它的能力。要使用的编码。
答案 1 :(得分:17)
文本? Writer
。它用于处理字符,荣誉编码。
流/字节数组? OutputStream
。适用于原始字节,没有字符,编码,字符串等概念。
答案 2 :(得分:0)
1)在许多情况下,最好重写[em> toString()或提供类似的方法将内部结构转换为文本。使用此方法的用户的优势是灵活性。例如,如果这种方法的使用者可以:
在某些情况下可能是不利的,例如当文本表示形式相对较大(例如100 MB)并且同时有许多请求产生此类对象时。这可能需要过多的资源(CPU,RAM)。在这种情况下,直接写入流或写入者可能是更好的选择。
2)如果您希望对象可以在许多不同的上下文中使用,那么提供两者,保存到流并保存到编写器是很有意义的。例如, HttpServletResponse 同时提供 getWriter()和 getOutputStream(),这样每个人都可以决定在自己的特定情况下哪个更好。或Jackson的JsonFactory为 File , OutputStream 和 Writer 提供了* createGenerator()*方法,给了消费者很大的自由度。>