私はさまざまな方法でストリームを出力しています。閉じる前に、出力ストリームのコンテンツの長さを調べるにはどうすればよいですか?出力ストリームのコンテンツ長を返信しますか?
答えて
最も簡単な方法は、おそらく、すべての書き込み要求を転送するが、内部カウンタを保持する別のOutputStream
実装にそれをラップすることです。それでは、代わりにそれを書くだけです。実装するにはあまりにも難しいはずはありません。実際にはすでに実装されている可能性があります。
編集:わかりやすい名前(CountingOutputStream
)で推測すると、Apache Commons IOという実装が登場しました。
EDIT:これはHTTP用で、クライアントが完全なデータのバッファリングをまだ行っていない場合(この場合、はコンテンツの長さになります)、 を書く必要があるために、データを書き込む前にの問題があります。場合によっては、特定のサイズ(クライアントがバッファリングする)まで動作して失敗することがあります。その場合、デイビッドの解決策が適切になるでしょう。
独自のByteArrayOutputStreamに書き込んで、最後にレスポンス出力ストリームに書き出すことを検討することもできます。
しかし、バイト[]のすべてのバイトがJVMのメモリの1バイトを食べるので、これは非常にメモリホギングになります。 – BalusC
出力ストリームにデータを書き込む前に、レスポンスヘッダーにコンテンツの長さを設定する必要があります。したがって、あなたのオプションは以下の通りです:
- ByteOutputStreamを使用してデータをバイト[]配列に書き込み、データのサイズを取得したらレスポンス出力ストリームにコピーします。しかし、大きなファイルを作成する場合、これは明らかにオプションではありません。
- 一時ファイルにデータを書き込み、ファイルサイズを取得したらレスポンス出力にコピーします。あなたがやっていることに応じて、これは容認できないパフォーマンスのペナルティを持つかもしれません。
- 最初にデータを生成するのがどれほど高価なのかに応じて、それを一度生成してそれを放棄してカウントを取得し、再度生成することができます。これが現実的な解決策であるとは思わない。
- レスポンスヘッダーでコンテンツの長さを報告できないという事実に気をつけてください。
- 1. Javaはスタックトレースを別の出力ストリームに送信します
- 2. ストリームのコンテンツの長さを取得
- 3. cURL GETリクエストは返信なし出力
- 4. 入出力ストリーム:ストリームの終わり?
- 5. [iPhone]:ワイヤレスネットワーク経由で出力ストリームを送信する方法は?
- 6. 出力ストリームを使用してコマンドを送信できません
- 7. Android Bluetooth入力/出力ストリーム:送信済み〜1400バイト、受信済み1008
- 8. C++出力ストリームを入力ストリームに接続する
- 9. Java EEの入出力ストリーム
- 10. C++の入出力ストリーム
- 11. Javaソケット/出力ストリーム書き込み:ブロックしますか?
- 12. WCFサービスからのストリーム出力
- 13. SimpleXMLはCDATA要素のコンテンツを返信し続けます
- 14. HttpURLConnection出力ストリーム中国語
- 15. Android&Object出力ストリーム:スタンドオフ
- 16. バッシュ出力ストリーム書込み
- 17. PHP:閉じる出力ストリーム
- 18. 動作時に出力ストリーム
- 19. Java出力ストリームが正しく出力されない
- 20. PydubとAplay:冗長出力を抑制しますか?
- 21. ImageResizerの出力ストリームのコンテンツのハッシュが期待どおりでない
- 22. コンテンツの長さを確認します
- 23. のHttpURLConnectionをコンテンツの長さは-1を返しアンドロイド4.0
- 24. 速いJava入力\出力ストリーム
- 25. PHP出力ストリームをJavaに渡す
- 26. ブラウザにUTF-16でエンコードされたgzipコンテンツの返信を返します。
- 27. 動的な位置の値/ファイル名を持つストリームを出力しますか?
- 28. HTTP出力ストリームを使用して複数のオブジェクトを送信する必要があります
- 29. 入力ストリームからオーディオ入力ストリームを取得できませんでした
- 30. MsBuildタスクの出力を返しますか?
U、Apache Commons!私はApache Commonsについて忘れないようにしなければならない!試してみます。 – Trick
それは働いています:) – Trick
大きなデータで動作しますか?デビッドが指摘したように、レスポンスのoutputStreamに何かを書く前に、 "Content-length"ヘッダを設定する必要があります。 –