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