4

BufferedReader次のネットワークコードから取得します。

    URL url = new URL(request);
    HttpURLConnection httpUrlConnection = (HttpURLConnection)url.openConnection();
    InputStream inputStream = httpUrlConnection.getInputStream();
    bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
  1. どちらが実行速度の面でより高い効率を与えるのだろうかと思いました。
  2. 1024サイズはAndroidに適していますか?または、使用できるシステム定数値はありますか?

        int charRead = 0;
        char[] buffer = new char[1024];
        StringBuffer stringBuffer = new StringBuffer();
        while ((charRead = bufferedReader.read(buffer)) > 0) {
            stringBuffer.append(buffer, 0, charRead);
        }
    

        String line = "";
        StringBuffer stringBuffer = new StringBuffer();
        while ((line = bufferedReader.readLine()) != null) {
            stringBuffer.append(line);
        }
4

3 に答える 3

1

最初のアプローチの方が効率的だと思いますが、バッファサイズを大きく設定したいと思います。8*1024。これは、HttpClientのデフォルトのCoreConnectionPNames.SOCKET_BUFFER_SIZEです。ほとんどのHTTPバッファは8*1024に設定されているため、8*1024未満のものは不合理だと言いたいです。

2番目のアプローチでは、ストリームに改行文字を想定しています。改行文字がないように最適化された20MBのjsonの場合はどうなりますか?これはあなたのアプリを吹き飛ばします。

改行は、改行('\ n')、キャリッジリターン('\ r')、またはキャリッジリターンの直後に改行が続くいずれかによって終了したと見なされます。

私の意見では、最良の選択は8*1024の乗算を使用することです。上限の制約は、ストリームのバッファ処理時間に対するメモリのサイズと接続速度に制限されます。

于 2012-06-15T18:44:07.157 に答える
1

同期を使用するオーバーヘッドが必要でない限り、を使用StringBuilderする方が良い代替手段と見なされます。(交換のドロップです)StringBufferStringBufferStringBuilder

readLine()パフォーマンスに関しては、最初のアプローチを使用し、行をテキスト行として処理する必要がない限り、使用を避けます。また、readLine()実際のラインフィードは返されないため、2番目の例で作成したデータにはラインフィードがないため、サーバーから送信されたデータと正確に一致しない可能性があります。

于 2012-06-15T19:08:03.557 に答える
0

より高いバッファ制限を設定することが最善のオプションです。

javadocによる

バッファサイズを指定することも、デフォルトのサイズを使用することもできます。デフォルトは、ほとんどの目的に十分な大きさです。

バッファリングはより良いアプローチです。再びドキュメントに従って

バッファリングを行わないと、read()またはreadLine()を呼び出すたびに、バイトがファイルから読み取られ、文字に変換されてから返される可能性があり、これは非常に非効率的です。

于 2012-06-15T18:40:22.327 に答える