2

http 呼び出しから応答を取得するこの 2 つの方法の一般的な違いがどこにあるのかを知りたいです。

以下は Android の例ですが、Java でもまったく同じです。

org.apache.httpライブラリのみを使用した最初の例:

String s = "";

try {

    HttpPost httppost = new HttpPost(url);
    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();

    s = EntityUtils.toString(entity, HTTP.UTF_8);

    // do something with s      
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

BufferedReader を使用して応答を取得する 2 番目の例:

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();

InputStream instream = entity.getContent();
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(
                instream));

try {
    String line;
    StringBuilder sb = new StringBuilder();
    while((line = bufferedreader.readLine()) != null)
            sb.append(line);

        // do something with the stringbuilder

} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

最初の例よりも Stream と Reader を使用する 2 番目の例を優先する必要があるシナリオと、その逆のシナリオはどれですか? 私がこの質問をする理由はいくつかあります。含まれていない重要な点があれば教えてください:

  1. リーダーのアプローチは、より多くのスペースと時間を必要とします。
  2. 応答データのサイズは、最初または 2 番目の例には影響しません。
  3. 2 番目の例のコードはより複雑です (より多くのオーバーヘッドがあります)。
  4. Reader アプローチは、ライブラリ内のさまざまな Reader の量により、より柔軟です。

この点から、私は最初の例を支持します。

4

2 に答える 2

2

最初の例では、ApacheEntityUtilsを使用してストリームを文字列で読み取ります。コードから、これが行うことは、 を使用してからコンテンツをReader固定サイズで読み取り、それを Buffer の形式に追加することです。char[]entity.getContent()

2 番目の例では、BufferedReader.

  1. 自体はそれ以上のBufferedReaderスペースを必要としないかもしれませんが、行を読み取る必要があるため (つまり、改行が見つかるまで)、バッファリングに必要なスペースの量は不明であり、応答に改行がない可能性があります。この行全体がバッファリングされ、文字列に読み取られてから追加され、メモリ内に 3 回表示されます。

  2. 同意した

  3. 例のコードBufferedReaderは明らかに長くなります。

  4. 3 番目の部分の方法を使用しないアプローチは、全体を読むのを待たずにストリームのコンテンツに取り組むことができるため、より柔軟です。

  5. このreadLineアプローチには、改行文字が失われるという別の欠点があります。場合によっては、情報を運ぶことがあります。

効率的かつ柔軟なアプローチが必要な場合は、apache EntityUtilsの実際の実装を見てください。バッファリングに固定サイズの char[] を使用して、メモリ オーバーヘッドの量を確実に把握し、改行を含むすべての文字を読み取ります。

readLine本当に役立つのは、行を読む必要がある場合だけです。(!)

(実装の関連部分:)

    Reader reader = new InputStreamReader(instream, charset);
    CharArrayBuffer buffer = new CharArrayBuffer(i);
    try {
        char[] tmp = new char[1024];
        int l;
        while((l = reader.read(tmp)) != -1) {
            buffer.append(tmp, 0, l);
        }
    } finally {
        reader.close();
    }
于 2013-09-26T12:00:39.633 に答える