res.flushBuffer() vs res.getOutputStream().flush();

Gio*_*nJh 5 java servlets web-applications http

打电话有什么区别:

res.flushBuffer();
Run Code Online (Sandbox Code Playgroud)

相对

res.getOutputStream().flush();  
Run Code Online (Sandbox Code Playgroud)

这些方法是否刷新相同的缓冲区?

如果是这样,你能给我一个关于 servlet 容器如何管理这个缓冲区的线索吗?

Dav*_* L. 3

如果您一直用于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;
Run Code Online (Sandbox Code Playgroud)

调用getOutputStream()创建一个CoyoteOutputStream使用outputBuffer此处显示的字段的 ,同样对于getWriter()。所以他们都会outputBuffer根据你使用的方式来使用它。flushBuffer只是这样做:

@Override
public void flushBuffer()
    throws IOException {
    outputBuffer.flush();
}
Run Code Online (Sandbox Code Playgroud)