2009-11-18 6 views

答えて

16

最も簡単な方法は、おそらく、すべての書き込み要求を転送するが、内部カウンタを保持する別のOutputStream実装にそれをラップすることです。それでは、代わりにそれを書くだけです。実装するにはあまりにも難しいはずはありません。実際にはすでに実装されている可能性があります。

編集:わかりやすい名前(CountingOutputStream)で推測すると、Apache Commons IOという実装が登場しました。

EDIT:これはHTTP用で、クライアントが完全なデータのバッファリングをまだ行っていない場合(この場合、はコンテンツの長さになります)、 を書く必要があるために、データを書き込む前にの問題があります。場合によっては、特定のサイズ(クライアントがバッファリングする)まで動作して失敗することがあります。その場合、デイビッドの解決策が適切になるでしょう。

+0

U、Apache Commons!私はApache Commonsについて忘れないようにしなければならない!試してみます。 – Trick

+0

それは働いています:) – Trick

+0

大きなデータで動作しますか?デビッドが指摘したように、レスポンスのoutputStreamに何かを書く前に、 "Content-length"ヘッダを設定する必要があります。 –

2

独自のByteArrayOutputStreamに書き込んで、最後にレスポンス出力ストリームに書き出すことを検討することもできます。

+5

しかし、バイト[]のすべてのバイトがJVMのメモリの1バイトを食べるので、これは非常にメモリホギングになります。 – BalusC

8

出力ストリームにデータを書き込む前に、レスポンスヘッダーにコンテンツの長さを設定する必要があります。したがって、あなたのオプションは以下の通りです:

  1. ByteOutputStreamを使用してデータをバイト[]配列に書き込み、データのサイズを取得したらレスポンス出力ストリームにコピーします。しかし、大きなファイルを作成する場合、これは明らかにオプションではありません。
  2. 一時ファイルにデータを書き込み、ファイルサイズを取得したらレスポンス出力にコピーします。あなたがやっていることに応じて、これは容認できないパフォーマンスのペナルティを持つかもしれません。
  3. 最初にデータを生成するのがどれほど高価なのかに応じて、それを一度生成してそれを放棄してカウントを取得し、再度生成することができます。これが現実的な解決策であるとは思わない。
  4. レスポンスヘッダーでコンテンツの長さを報告できないという事実に気をつけてください。
関連する問題