java中的servlet-getWriter()和getOutputStream()都是

java中的servlet-getWriter()和getOutputStream()都是,java,servlets,Java,Servlets,为什么在ServletResponse的实例上,getWriter()和getOutputStream()都不能调用?通常这是因为getOutputStream()用于编写二进制内容,而getWriter()用于编写文本内容。在一个servlet请求中同时编写这两个请求是没有意义的——您应该使用其中一个或另一个。设计决策。Writer和OutputStream都维护自己的缓冲区。如果您分别创建了一个,则需要以某种方式合并它们的输出。可能,但更复杂。因此,他们决定您必须选择是基于字符的输出还是二进

为什么在
ServletResponse
的实例上,
getWriter()
getOutputStream()
都不能调用?

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

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

因为
编写器
是比
输出流
更高级的抽象。它控制底层流的字符编码,并合并自己的缓冲机制

如果在先前使用Writer之后直接写入OutputStream,则底层流将有很高的损坏风险,这可能是因为字符编码混淆或缺少缓冲数据

为了防止这种混淆,ServletAPI禁止对任何一个响应同时使用这两种方法


更实际地说,您可以使用OutputStream来编写二进制内容,使用Writer来编写文本内容。

如果您解释一下为什么要在一个servlet请求中同时调用这两个内容,可能会有所帮助。Abkutty可能不想同时调用这两个内容,但servlet、错误处理servlet和一些过滤器都试图编写输出,而且它们之间没有正确地协调使用哪种方法。我会再考虑一下为什么要同时使用这两种方法。@Phil&@Peter:这只是设计决策的问题,不是我想同时使用这两种方法。那么为什么getWriter()不在getOutputStream()的结果上返回一个包装器呢?因为如果您尝试同时对这两种方法进行写入,由于缓冲不协调,结果会变得一团糟。或者你在问为什么Writer不公开OutputStream的二进制输出方法?谢谢!通过取消对getWriter()的调用并仅使用getOutoutStream(),我能够消除错误“getOutputStream()已经在该响应上被调用”。