6

呼び出しの違いは何ですか:

res.flushBuffer();

res.getOutputStream().flush();  

これらのメソッドは同じバッファをフラッシュしますか?

もしそうなら、このバッファがサーブレットコンテナによってどのように管理されているかについての手がかりを教えていただけますか?

4

2 に答える 2

2

呼び出しの違いは何ですか...

唯一の重要な違いは、最初のバージョンは本文をテキストまたはバイナリ モードで書いているか、書き込もうとしているかに関係なく機能するのに対し、2 番目のバージョンはバイナリ モード出力でのみ機能することです。

これらのメソッドは同じバッファをフラッシュしますか?

javadocs は明示的な回答を提供しないため、技術的には実装に依存します。ただし、実際には、ほとんどの実装で答えはおそらく「YES」です。これは、別個のバッファーを持つことが理にかなっているとは考えにくいためです。

javadoc には、これに関する間接的な証拠がいくつかあります。

  • のjavadocは次のように述べています:「レスポンスの本文のsetBufferSize(int)優先バッファサイズを設定します。」つまり、このバッファは、javadoc で参照されている「バッファ」と同じです。flushBuffer()

  • の javadoc は次のようにflushBuffer()述べています。「このメソッドを呼び出すと、応答が自動的にコミットされます。つまり、ステータス コードとヘッダーが書き込まれます。」...これは、事実上、すべてに対して 1 つのバッファーがあるモデルと一致しています。

もう 1 つの注意点として、サーブレットが認識する応答オブジェクトは、実際にはフィルター チェーンのさらに上に挿入されたアプリケーション固有のラッパーである可能性があります。このようなラッパーは、javadoc (および残りのサーブレット仕様) の記述と矛盾する動作をする可能性があります。


もしそうなら、このバッファがサーブレットコンテナによってどのように管理されているかについての手がかりを教えていただけますか?

最善の策は、コンテナーのソース コードを確認することです。

于 2012-11-10T01:21:01.090 に答える
2

getOutputStreamボディへの書き込みに使用していた場合、同じバッファをフラッシュします。もう 1 つの方法はgetWriter、非バイナリ データ用です。それを使用していた場合、res.getOutputStream().flush();おそらく呼び出しは機能しませんでした。

バッファを管理する方法は実装固有ですが、Tomcat 実装の 1 つを例にとります。次のようなフィールドがいくつかあることがわかります。

/**
 * The associated output buffer.
 */
protected OutputBuffer outputBuffer;
/**
 * The associated output stream.
 */
protected CoyoteOutputStream outputStream;
/**
 * The associated writer.
 */
protected CoyoteWriter writer;

を呼び出すと、そこに表示されているフィールドを使用する がgetOutputStream()作成され、同様に も作成されます。したがって、どちらを使用するかに応じて、どちらもそれを使用します。単純にこれを行います:CoyoteOutputStreamoutputBuffergetWriter()outputBufferflushBuffer

@Override
public void flushBuffer()
    throws IOException {
    outputBuffer.flush();
}
于 2012-11-10T01:25:09.553 に答える