什么是调用之间的区别:
res.flushBuffer();
与
res.getOutputStream().flush();
难道这些方法刷新相同的缓冲?
如果是这样,你可以给我如何实现此缓冲区的servlet容器管理的线索?
什么是调用之间的区别:
res.flushBuffer();
与
res.getOutputStream().flush();
难道这些方法刷新相同的缓冲?
如果是这样,你可以给我如何实现此缓冲区的servlet容器管理的线索?
如果你一直在使用,他们将刷新相同缓冲getOutputStream
写信给身体。 另一种方法是getWriter
用于非二进制数据。 如果您已经使用,然后调用res.getOutputStream().flush();
可能是行不通的。
缓冲区的管理方式是实现特定的,但采取Tomcat的实现,例如之一 。 你可以看到,有一些像这样的字段:
/**
* The associated output buffer.
*/
protected OutputBuffer outputBuffer;
/**
* The associated output stream.
*/
protected CoyoteOutputStream outputStream;
/**
* The associated writer.
*/
protected CoyoteWriter writer;
调用getOutputStream()
创建一个CoyoteOutputStream
使用该outputBuffer
被示出有,同样也指字段getWriter()
因此,他们都将使用outputBuffer
,这取决于您使用。 flushBuffer
只是做到这一点:
@Override
public void flushBuffer()
throws IOException {
outputBuffer.flush();
}
什么叫之间的区别...
唯一的显著不同的是,第一个版本将工作无论你是写/打算写在文本或二进制模式的身体,而第二个版本只用二进制模式输出工作。
难道这些方法刷新相同的缓冲?
由于的javadoc不给一个明确的答案,在技术上它是依赖于实现的。 然而,在实践中,答案很可能是“YES”对于大多数的实现,因为它是很难想象它使意义有不同的缓冲区。
有这个在javadoc的一些间接证据:
适用于Javadoc setBufferSize(int)
表示:“设置用于响应的主体中的优选的缓冲器大小”。 其含义是,该缓冲液是相同的“缓冲”在Javadoc称为用于flushBuffer()
适用于Javadoc flushBuffer()
说:“这个方法的调用会自动提交的响应,这意味着状态码和头将被写入。” ......这是一个模型,其中有一切有效的一个缓冲区一致。
另外要注意的是一个Servlet看到响应对象可能实际上是进一步插入了滤镜链中的专用包装。 这是可能的,例如一个包装的方式,是用什么的Javadoc(与Servlet规范的其余部分)表示不一致的行为。
如果是这样,你可以给我如何实现此缓冲区的servlet容器管理的线索?
最好的办法是看在容器的源代码。