1

私は Android アプリケーションを開発しています。大量の JSON データをストリームでフェッチします。Web サービスの呼び出しは問題ありませんが、少し問題があります。私の古いバージョンでは、ストリームの読み取りに Gson を使用していましたが、データベースにデータを挿入しようとしましたが、パフォーマンス以外は問題なく問題ありませんでした。そのため、データをロードするアプローチを変更しようとしましchar[]た。最初にデータを読み取ってからデータベースに挿入しようとしています。

これは私の新しいコードです:

HttpEntity responseEntity = response.getEntity();
final int contentLength = (int) responseEntity.getContentLength();
InputStream stream = responseEntity.getContent();
InputStreamReader reader = new InputStreamReader(stream);

int readCount = 10 * 1024;
int hasread = 0;
char[] buffer = new char[contentLength];
int mustWrite = 0;
int hasread2 = 0;
while (hasread < contentLength) {
    // problem is here
    hasread += reader.read(buffer, hasread, contentLength - hasread);
}

Reader reader2 = new CharArrayReader(buffer);

問題は、リーダーが正しく読み取りを開始することですが、ストリームの終わり近くで、hasread変数の値が1増加するのではなく減少することです。私には非常に奇妙で、whileループが終了しません。このコードの何が問題になっていますか?

4

1 に答える 1

2

データ全体のサイズ ( ) ではなく、バッファーに固定サイズを使用する必要がありますcontentLength。重要注意点: 配列の長さはchar[]配列の長さとは異なりbyte[]ます。データ型は、単一のchar16 ビット Unicode 文字です。データ型はbyte8 ビットの符号付き 2 の補数整数です。

また、whileループが間違っています。次のように修正できます。

import java.io.BufferedInputStream;

private static final int BUF_SIZE = 10 * 1024;

// ...

HttpEntity responseEntity = response.getEntity();
final int contentLength = (int) responseEntity.getContentLength();
InputStream stream = responseEntity.getContent();
BufferedInputStream reader = new BufferedInputStream(stream);

int hasread = 0;
byte[] buffer = new byte[BUF_SIZE];
while ((hasread = reader.read(buffer, 0, BUF_SIZE)) > 0) {
    // For example, convert the buffer to a String
    String data = new String(buffer, 0, hasread, "UTF-8");
}

"UTF-8"必ず独自の文字セット ( , "UTF-16"…)を使用してください。

于 2013-03-13T08:24:56.350 に答える