4

HttpURLConnection の InputStream を読み取るとき、次のいずれかを使用する理由はありますか? 例で両方が使用されているのを見てきました。

手動バッファ:

while ((length = inputStream.read(buffer)) > 0) {
    os.write(buf, 0, ret);
}

BufferedInputStream

is = http.getInputStream();
bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);

int current = 0;
while ((current = bis.read()) != -1) {
     baf.append(current);
}

EDIT私はまだ一般的にHTTPに不慣れですが、頭に浮かぶ1つの考慮事項は、永続的なHTTP接続を使用している場合、入力ストリームが空になるまで読み取ることができないということですよね? その場合、メッセージの長さを読み取って、その長さの入力ストリームを読み取る必要はありませんか?

同様に、永続的な接続を使用していない場合、ストリームを適切に読み取るという点で、私が含めたコードは 100% 適切ですか?

4

4 に答える 4

5

Android での JSON の使用に関する投稿で、ブログでそれを行う良い方法について説明しています。http://blog.andrewpearson.org/2010/07/android-why-to-use-json-and-how-to-use.html . 関連する投稿の関連部分を以下に投稿します(コードはかなり一般化できます):

InputStream in = null;
String queryResult = "";
try {
     URL url = new URL(archiveQuery);
     HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
     HttpURLConnection httpConn = (HttpURLConnection) urlConn;
     httpConn.setAllowUserInteraction(false);
     httpConn.connect();
     in = httpConn.getInputStream();
     BufferedInputStream bis = new BufferedInputStream(in);
     ByteArrayBuffer baf = new ByteArrayBuffer(50);
     int read = 0;
     int bufSize = 512;
     byte[] buffer = new byte[bufSize];
     while(true){
          read = bis.read(buffer);
          if(read==-1){
               break;
          }
          baf.append(buffer, 0, read);
     }
     queryResult = new String(baf.toByteArray());
     } catch (MalformedURLException e) {
          // DEBUG
          Log.e("DEBUG: ", e.toString());
     } catch (IOException e) {
          // DEBUG
          Log.e("DEBUG: ", e.toString());
     }
}
于 2010-07-20T20:39:18.333 に答える
2

持続的HTTP接続に関しては、正反対です。入力ストリームからすべてを読み取る必要があります。そうしないと、Java HTTPクライアントは、HTTP要求が完了したことを認識せず、ソケット接続を再利用できます。

http://java.sun.com/javase/6/docs/technotes/guides/net/http-keepalive.htmlを参照してください。

Keep-Aliveを支援するために何ができますか?

応答本文を無視して接続を放棄しないでください。これを行うと、TCP接続がアイドル状態になる可能性があります。参照されなくなったときにガベージコレクションする必要があります。

getInputStream()が正常に戻った場合は、応答本文全体を読み取ります。

于 2010-06-19T16:49:37.523 に答える
0

前者を使用します-後者は最初のものに比べて実際の利点はなく、少し遅くなります。バッファリングされていても、バイトごとに読み取ることは非効率的です(ただし、バッファリングされていない場合はひどく遅くなります)。そのスタイルの読み取り入力は、Cでは流行しなくなりました。ただし、ある種のエンドマーカーを見つける必要がある場合に役立つことがあります。

于 2010-10-20T16:09:32.213 に答える
-1

BufferedInputStream固有のメソッドを使用している場合のみ。

于 2010-05-08T06:31:11.110 に答える