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

您应该为缓冲区使用固定大小,而不是整个数据的大小 (the contentLength)。还有一个重要的注意事项:数组的长度与char[]数组的长度不同byte[]。数据类型是char单个 16 位 Unicode 字符。而byte数据类型是一个 8 位有符号二进制补码整数。

您的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 回答