我们通常在android开发中从服务器响应中获取数据。
/*
* get server response inputStream
*/
InputStream responseInputStream;
Solution1:通过多次读取获取响应字符串。
/*
* get server response string
*/
StringBuffer responseString = new StringBuffer();
responseInputStream = new InputStreamReader(conn.getInputStream(),"UTF-8");
char[] charBuffer = new char[bufferSize];
int _postion = 0;
while ((_postion=responseInputStream.read(charBuffer)) > -1) {
responseString.append(charBuffer,0,_postion);
}
responseInputStream.close();
解决方案2:只获得一次阅读回复。
String responseString = null;
int content_length=1024;
// we can get content length from response header, here assign 1024 for simple.
responseInputStream = new InputStreamReader(conn.getInputStream(),"UTF-8");
char[] charBuffer = new char[content_length];
int _postion = 0;
int position = responseInputStream.read(charBuffer)
if(position>-1){
responseString = new String(charBuffer,0,position );
}
responseInputStream.close();
哪种解决方案有更好的性能?为什么呢?
注意:服务器响应json格式的数据小于1M字节。
答案 0 :(得分:2)
为什么要重新发明轮子? ;)
如果您使用的是HttpClient,请使用EntityUtils.toString(...)
我猜你正在使用HttpURLConnection
。然后从Apache HttpClient查看EntityUtils.toString(...)
- source code。你的第一种方法与它相似。
new String(charBuffer,0,position )
运行垃圾收集器
同时在EntityUtils中:
int content_length = 1024;
在大多数情况下,8192是套接字缓冲区的默认值,因此您的代码可能会循环运行8次,而不是它。
答案 1 :(得分:1)
如果您不想要显示下载/传输的数据量,我建议使用第二方法。由于对象是作为一个整体读取的,并且由于JSON字符串的大小与1M相当,因此下载需要一些时间。那时你可以为用户提供一个文字下载.. 。您无法通知用户下载的金额。
但是,如果要显示下载的数据量,请使用您提供的第一个方法。你在哪里从服务器读取数据的部分。您可以使用下载的金额更新 UI 。例如 25%已下载...
char[] charBuffer = new char[bufferSize];
int _postion = 0;
int i=0;
while ((_postion=responseInputStream.read(charBuffer)) > -1) {
//((i*buffer_size)/content_length) * 100 % completed..
i++;
}
所以,我会说秒方法更好。
ObjectInputStream in = new InputStreamReader(conn.getInputStream(),"UTF-8");
if(resposeCode==200)
{
String from_server=(String) in.readObject();
}
将输入String作为对象读取。任何类实现可序列化的对象都可以使用ObjectOutputStream
传递,并使用ObjectInputStream()
答案 2 :(得分:0)
我认为第一个是好的
因为,在第一中,将以char to char方式读取您的响应。
其中,第二将尝试读取整个响应对象或作为关键文件对象。
所以,正如我所想,并且根据我的知识,第一个最好是第二个露营。如果有人想编辑,那么它将真正感激。