通过HttpGet从Web服务读取char [] - 奇怪的行为

时间:2013-03-13 07:41:42

标签: java android network-programming streaming

我正在开发一个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循环永远不会完成。这段代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

您应该为缓冲区使用固定大小,而不是整个数据的大小(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" ...)。