4

アプリケーションで Apache HttpClient 4.2.3 を使用しています。HTTP 呼び出しの応答を次のように保存します。

HttpResponse httpResponse = (DefaultHttpClient)httpClient.execute(httpRequest);

応答本文は、4.x API の InputStream です。

InputStream responseStream = httpResponse.getEntity().getContent();

私の問題は、アプリケーションのさまざまなポイントで、応答本文を文字列および byte[] として読み取る必要があることです。しかし、Apache が使用する InputStream は EofSensorInputStream です。つまり、ストリーム EOF に達すると、閉じられます。とにかく、文字列とバイト [] 表現を複数回取得し、ストリームを閉じないことはできますか?

バイト配列を新しい ByteArrayInputStream にラップし、それをリクエスト本文として設定しようとしましたが、応答本文が数ギガに達する可能性があるため、機能しません。これも試してみましたが、元の応答ストリームがまだ閉じられていることに気付きました。

どんなポインタでも大歓迎です。

編集: 関連する注意事項として、ストリームを消費せずに、または消費を逆にすることで、InputStream の長さを見つけることができれば、それも素晴らしいことです。

4

1 に答える 1

3

1. 多少矛盾する要件があると思います:

a)

私の応答本文は数ギガに達する可能性があるため、機能しません

b)

とにかく、文字列とバイト [] 表現を複数回取得し、ストリームを閉じないことができますか

十分なメモリがない場合、これは不可能です。

ところで、応答をバイトとして取得する別の方法はEntityUtils.byte[] toByteArray(final HttpEntity entity).

N-ギグの文字列が本当に必要ですか? あなたはそれで何をするつもりですか?

2.

InputStream の長さを見つけることができれば、それも素晴らしいことです

httpResponse.getEntity().getContentLength()

3. 応答はメモリに収まらないため、ファイル (または一時ファイル) に保存することをお勧めします。次に、そのファイルに InputStream を設定し、必要な回数だけ読み取ります。

于 2013-04-25T13:28:43.673 に答える