gpt4 book ai didi

java - HttpURLConnection : What is the right way to read data from a WebService, 逐字符还是逐行?

转载 作者:搜寻专家 更新时间:2023-11-01 07:57:37 24 4
gpt4 key购买 nike

我知道之前有人问过这个问题,但由于我无法找到具有明确结论的答案,或者至少找不到显示可能方法优缺点的答案,我不得不问:

当谈到从 Internet 读取数据(例如网络服务)时,读取此数据的正确或更有效的方法是什么?

在我翻阅的所有书籍中,我发现了至少 4 种读取数据的方法:

1) 一次读取特定数量的字符。 在这种情况下,数据以 4026 个字符的 block 形式读取

BufferedReader reader = new BufferedReader(
new InputStreamReader(in, encoding));
char[] buffer = new char[4096];
StringBuilder sb = new StringBuilder();
int downloadedBytes = 0;
int len1 = 0;
while ((len1 = reader.read(buffer)) > 0) {
sb.append(buffer);
}
return sb.toString();

2) 读取知道内容长度的数据

int length =(HttpURLConnection) urlConnection.getContentLength();
InputStream inputStream = urlConnection.getInputStream();
BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder(length);
char[] buffer = new char[length];
int charsRead;
while ((charsRead = bufferedReader.read(buffer)) != -1) {
stringBuilder.append(buffer, 0, charsRead);
}
return stringBuilder.toString();

3) 逐行读取数据:

BufferedReader reader=new BufferedReader(new InputStreamReader(c.getInputStream()));
StringBuilder buf=new StringBuilder();
String line=null;
while ((line=reader.readLine()) != null) {
buf.append(line);
}
return(buf.toString());

4)逐个字符读取数据:

InputStream in = mConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(
in, enconding));
int ch;
StringBuilder sb = new StringBuilder();
while ((ch=reader.read()) > 0) {
sb.append((char)ch);
}

return sb.toString().trim();

我已经尝试了这 4 种不同技术中的 3 种,除了第 3 种(逐行读取数据)并且在这三种技术中只有第四种给了我很好的结果。

  • 第一种方法对我不起作用,因为当我读取大量数据时,它经常会剪切数据,从而导致无效的 json 字符串或末尾带有空格的字符串。
  • 第二种方法,我无法使用该方法,因为 getContentLength 并不总是可靠,如果未设置该值,我们也无能为力,这就是我的情况.
  • 我没有尝试第三种方法,因为我不确定“逐行”读取数据的事实。这适用于包含 json 对象数组的数据还是仅适用于确实包含行的文件??
  • 作为我最后选择的最后一种技术,我尝试了它并且它起作用了,但我认为逐个字符地读取大量数据根本没有效率。

所以现在我非常感谢您的意见和想法。从网络服务读取数据时,您使用什么方法?更重要的是为什么?

谢谢。

PD我知道我可以轻松使用 DefaultHttpClient,但是 the doc明确鼓励不要这样做。

For Android 2.3 (Gingerbread) and later, HttpURLConnection is the best choice. Its simple API and small size makes it great fit for Android. Transparent compression and response caching reduce network use, improve speed and save battery.

最佳答案

您提到的所有方法我都试过了。面临的一个问题是回复没有被完整阅读。经过一些研究,我发现最有效/最快的方法是像这样去做

       DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);

httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Content-type", "application/json");
//ive put json header because im using json


try {
HttpResponse execute = client.execute(httpGet);


String responseStr = EntityUtils.toString(execute.getEntity());

}

responseStr 将包含 web 服务回复并一次性读取它。希望这有帮助

关于java - HttpURLConnection : What is the right way to read data from a WebService, 逐字符还是逐行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25860912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com