【问题标题】:Servlets in java - both getWriter() and getOutputStream()Java 中的 Servlet - getWriter() 和 getOutputStream()
【发布时间】:2011-01-20 10:44:18
【问题描述】:

为什么在ServletResponse 的实例上不能同时调用getWriter()getOutputStream()

【问题讨论】:

  • 如果您要解释为什么要在一个 servlet 请求中同时调用两者,这可能会有所帮助。
  • 可能不是 Abkutty 想要同时调用这两者,而是 Servlet、错误处理 Servlet 和一些 Filter 都在尝试写入输出,并且它们之间没有正确协调使用哪种方法。
  • 我会再想想你为什么要两者兼得。
  • @Phil & @Peter:这只是一个关于设计决策的问题,并不是我想要两者兼得。

标签: java servlets


【解决方案1】:

设计决策。 Writer 和 OutputStream 都维护自己的缓冲区。如果您每人创建一个,那么它们的输出将需要以某种方式合并。可能,但更复杂。所以他们决定你必须选择是基于字符的输出还是二进制输出。

【讨论】:

  • 那么为什么 getWriter() 没有在 getOutputStream() 的结果上返回一个包装器呢?
  • 因为如果你试图同时写入两者,你会因为不协调的缓冲而弄乱结果。还是你问为什么 Writer 不公开 OutputStream 的二进制输出方法?
【解决方案2】:

因为Writer 是比OutputStream 更高级别的抽象。它控制底层流的字符编码,并结合了自己的缓冲机制。

如果您在之前使用过 Writer 之后直接写入 OutputStream,则由于字符编码混淆或缺少缓冲数据,底层流的损坏风险很高。

为防止这种混淆,servlet API 禁止将两者用于任何一个响应。

更实际的是,您使用 OutputStream 编写二进制内容,使用 Writer 编写文本内容。

【讨论】:

    【解决方案3】:

    通常这是因为getOutputStream() 用于编写二进制内容,而getWriter() 用于编写文本内容。在一个 servlet 请求中同时编写两者是没有意义的 - 您应该使用其中一个。

    【讨论】:

    • 谢谢!通过消除调用 getWriter() 并仅使用 getOutoutStream(),我能够摆脱我的错误“getOutputStream() 已在此响应中调用”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2015-03-24
    • 2018-03-25
    • 2018-11-21
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多