9

さまざまな方法で出力ストリームに書き込んでいます。閉じる前に、出力ストリームのコンテンツの長さを確認するにはどうすればよいですか?

4

3 に答える 3

18

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

編集:賢明な名前()を推測するだけで、ApacheCommonsIOCountingOutputStream実装が思い浮かびました。

編集:他の場所で述べたように、これがHTTP用であり、クライアントがまだ完全なデータのバッファリングを行っていない場合(この場合、コンテンツの長さを計算できると思います)、データを書き込むに長さを書き込みます。場合によっては、特定のサイズ(クライアントがバッファリングする)まで機能し、その後失敗することがあります。その場合、Davidのソリューションが適切になります。

于 2009-11-18T14:37:29.743 に答える
9

問題は、出力ストリームへのデータの書き込みを開始する前に、応答ヘッダーにコンテンツの長さを設定する必要があることです。したがって、オプションは次のとおりです。

  1. ByteOutputStream を使用して byte[] 配列にデータを書き込み、データのサイズを取得したら、それを応答出力ストリームにコピーします。ただし、大きなファイルを書き込んでいる場合、これは明らかにオプションではありません。
  2. データを一時ファイルに書き込み、ファイル サイズを取得したら、それを応答出力にコピーします。実行内容によっては、許容できないほどパフォーマンスが低下する場合があります。
  3. 最初にデータを生成するコストに応じて、データを一度生成し、それを破棄してカウントを取得してから、再度生成することができます。これが現実的な解決策になる可能性は低いと推測しています。
  4. 応答ヘッダーでコンテンツの長さを報告できないという事実を受け入れてください。
于 2009-11-18T15:26:08.567 に答える
2

独自のByteArrayOutputStreamに書き込んで、最後に応答出力ストリームにフラッシュすることを検討してください。

于 2009-11-18T14:36:51.973 に答える