2011-01-20 157 views
9

ServletResponseのインスタンスでgetWriter()getOutputStream()の両方を呼び出せないのはなぜですか?javaのサーブレット - getWriter()とgetOutputStream()の両方

+0

1つのサーブレットリクエストで両方を呼び出したい理由を説明すると役に立ちます。 –

+0

おそらくAbkuttyはServlet、Servlet、エラー処理Servlet、およびFilterをすべて出力しようとしていて、どちらのメソッドを適切に調整していないのかを両方とも呼びたいとは思わないでしょう。 – Thilo

+0

私はもうなぜあなたが両方を持っていたいと思うだろう。 –

答えて

18

デザインの決定。 WriterとOutputStreamはどちらも独自のバッファを保持します。それぞれを作成した場合、その出力は何とかマージする必要があります。可能ですが、もっと複雑です。そこで、文字ベースの出力とバイナリ出力のどちらを選択する必要があるかを決めました。

+0

なぜgetWriter()はgetOutputStream()の結果にラッパーを返しませんか? –

+0

両方に書き込もうとすると、調整されていないバッファリングのために結果が乱れることになります。あるいは、WriterがOutputStreamのバイナリ出力メソッドを公開しない理由を尋ねていますか? – Thilo

4

一般に、getOutputStream()はバイナリコンテンツの書き込みに使用され、getWriter()はテキストコンテンツの書き込みに使用されるためです。どちらのサーブレットリクエストでも両方を記述することは意味がありません。どちらか一方を使用する必要があります。

12

Writerは、OutputStreamよりも高いレベルの抽象化であるためです。基本ストリームの文字エンコーディングを制御し、独自のバッファリングメカニズムを組み込みます。

Writerを以前に使用した後に直接OutputStreamに書き込むと、文字エンコーディングが混在しているか、バッファされていないデータが存在するため、下にあるストリームが破損する危険性が高くなります。

この混乱を避けるため、サーブレットAPIはいずれの応答に対しても両方を使用することを禁じます。

実際には、バイナリコンテンツを書き込むためにOutputStreamを使用し、テキストコンテンツを書き込むためにWriterを使用します。

関連する問題