我正在设计一个库,其中一个类应该能够将自身内部结构转换为文本。我应该使用哪个类: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);
}
哪一个?
文本?Writer
. 它用于处理字符,尊重编码。
流/字节数组?OutputStream
. 适用于原始字节,没有字符、编码、字符串等概念。
1) 在许多情况下,更可取的方法是覆盖toString()或提供类似的方法将 ...内部转换为 text。这种方法的优点是灵活性。例如,如果这种方法的使用者可以:
在某些情况下它可能是不利的,例如当文本表示相对较大(如 100 MB)并且同时有许多请求产生此类对象时。这可能需要太多资源(CPU、RAM)。在这种情况下,直接写入流或写入器可能更可取。
2)如果你希望你的对象可以在许多不同的环境中使用,那么它是有道理的,提供两个,保存到一个流并将其保存到一个作家。例如,HttpServletResponse提供了getWriter()和getOutputStream(),这样每个人都可以决定在他的特定情况下哪个更好。或者 Jackson 的JsonFactory为File、OutputStream和Writer提供了方法 * createGenerator()* ,给了消费者很大的自由。
An
OutputStream
是面向字节的流。您编写的任何文本都必须使用某种编码(最常见的是 ISO-8859-1 或 UTF-8)编码为字节。AWriter
是一个面向字符的流,它可能会或可能不会在内部将字符编码为字节,具体取决于它写入的内容。编辑如果你正在设计一个库,那么如果你提供一个
OutputStream
面向的接口来写入文本,你真的应该为客户端类提供控制要使用的编码的能力。