。res.flushBuffer()与res.getOutputStream()平齐();(res.

2019-08-02 13:20发布

什么是调用之间的区别:

res.flushBuffer();

res.getOutputStream().flush();  

难道这些方法刷新相同的缓冲?

如果是这样,你可以给我如何实现此缓冲区的servlet容器管理的线索?

Answer 1:

如果你一直在使用,他们将刷新相同缓冲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();
}


Answer 2:

什么叫之间的区别...

唯一的显著不同的是,第一个版本将工作无论你是写/打算写在文本或二进制模式的身体,而第二个版本只用二进制模式输出工作。

难道这些方法刷新相同的缓冲?

由于的javadoc不给一个明确的答案,在技术上它是依赖于实现的。 然而,在实践中,答案很可能是“YES”对于大多数的实现,因为它是很难想象它使意义有不同的缓冲区。

有这个在javadoc的一些间接证据:

  • 适用于Javadoc setBufferSize(int)表示:“设置用于响应的主体中的优选的缓冲器大小”。 其含义是,该缓冲液是相同的“缓冲”在Javadoc称为用于flushBuffer()

  • 适用于Javadoc flushBuffer()说:“这个方法的调用会自动提交的响应,这意味着状态码和头将被写入。” ......这是一个模型,其中有一切有效的一个缓冲区一致。

另外要注意的是一个Servlet看到响应对象可能实际上是进一步插入了滤镜链中的专用包装。 这是可能的,例如一个包装的方式,是用什么的Javadoc(与Servlet规范的其余部分)表示不一致的行为。


如果是这样,你可以给我如何实现此缓冲区的servlet容器管理的线索?

最好的办法是看在容器的源代码。



文章来源: res.flushBuffer() vs res.getOutputStream().flush();