作家或输出流?

IT小君   2021-10-30T05:44:02

我正在设计一个库,其中一个类应该能够将自身内部结构转换为文本。我应该使用哪个类:OutputStreamWriter? 它们之间的主要区别是什么(就我而言)?

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

哪一个?

评论(3)
IT小君

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

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

2021-10-30T05:44:02   回复
IT小君

文本?Writer. 它用于处理字符,尊重编码。

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

2021-10-30T05:44:03   回复
IT小君

1) 在许多情况下,更可取的方法是覆盖toString()或提供类似的方法将 ...内部转换为 text这种方法优点灵活性例如,如果这种方法的使用者可以:

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

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

2)如果你希望你的对象可以在许多不同的环境中使用,那么它是有道理的,提供两个,保存到一个流并将其保存到一个作家。例如,HttpServletResponse提供了getWriter()getOutputStream(),这样每个人都可以决定在他的特定情况下哪个更好。或者 Jackson 的JsonFactoryFileOutputStreamWriter提供了方法 * createGenerator()* ,给了消费者很大的自由。

2021-10-30T05:44:03   回复