- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道之前有人问过这个问题,但由于我无法找到具有明确结论的答案,或者至少找不到显示可能方法优缺点的答案,我不得不问:
当谈到从 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 种(逐行读取数据)并且在这三种技术中只有第四种给了我很好的结果。
所以现在我非常感谢您的意见和想法。从网络服务读取数据时,您使用什么方法?更重要的是为什么?
谢谢。
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/
我一直在研究一个调用 Rest API 的 portlet。当API被调用且请求的数据不存在时,返回相应的JSON格式的错误信息(带有Bad request http code - 400),如果id
我有这个在 Windows VM 上运行的简单代码: URL url = new URL("http:xxx.xxx.xxx.xxx/api/cities.json"); HttpURLConnect
我有一个这样的代码: HttpURLConnection connection = (HttpURLConnection) loginUrl.openConnection(); connection.
Google 提供了 2 个不同的 HttpURLConnection 用法示例。 调用InputStream的close http://developer.android.com/training/
我想对自己编写的HTTP Servlet发出POST请求。通过使用URL.openConnection()方法,好的情况(HTTP响应代码200)始终可以正常工作。但是当我收到所需的错误响应代码(例如
您好,我已经开始使用 HttpUrlConnection,我有一个关于 Http 请求实际发送时间的问题。 我在某处读到,调用 getInputStream() 时会发送实际请求。不过,我已经编写了一
从 android 创建 HTTPURLConnection 时,有人对何时关闭连接和何时断开连接有任何经验吗?是否应该始终使用断开连接,以便可以从池中重用连接而不是重新创建连接?使用断开连接与关闭有
问题: 尝试“连接”时出现间歇性但频繁的故障。 代码、调试消息和堆栈跟踪如下。我看过类似的 问题解答,以及 android 开发人员帮助,但找不到 对失败的回答。 任何帮助表示赞赏。 编码: publ
我一直在尝试创建一个小的应用程序,该应用程序连接到editText中的url并返回状态代码。 这是onCreate代码: override fun onCreate(savedInstanceSta
我正在尝试创建 get 连接,但是当我读取服务器上的 header 时,我发现请求方法接收为 POST 而不是 GET 最佳答案 尝试删除此行:connection.setDoOutput(true)
我正在尝试将 x-www-form-urlencoded 格式的正文发送到我的本地 Web API。我可以毫无问题地进行 GET 。这是我所做的: String urlParameters =
我是 Android 开发新手,在互联网上进行了一些咨询后,我想出了以下代码来连接到 Url、POST 字符串内容并读取其响应。 private static java.lang.String get
我使用 HTTPUrlConnection 和 GET 方法从服务器获取数据,返回字符串大约 13k 个字符,但我只收到 1228 个字符。 有什么解决方案可以超过接收所有字符吗? 这是我的代码: U
我正在使用 HttpUrlConnection 来使用 REST 服务。当我执行 GET 时,就像下面显示的那样,我不想获取逐个字符返回的信息。我想以返回的格式获得结果。例如,在这里,我想获得一个 b
我从互联网上找到了下面的两段代码,我正在我的应用程序中使用它。 我真的不明白的一件事是,为什么没有调用 HttpUrlConnection.connect() 来建立 Http 连接(握手),并且没有
当使用下面的代码发出 get 请求时: private String get(String inurl, Map headers, boolean followredirects) throws Ma
我向我的用户提供下载文件的机会。 有时这个文件非常大,我在下载时实现一个 ProgressDialog。 好吧,如果用户点击返回,我想取消AsyncTask并关闭连接: @Ov
我正在尝试使用 Java 建立与立交桥的服务器连接。但是,当我的请求参数中有空格(例如 Bulach West)时,我总是会收到错误的请求响应。我使用的代码如下: StringBuilder cont
我使用 HttpURLConnection 按顺序向服务器 HttpServer 发出多个短请求。我期望的最大吞吐量是多少?我无法获得超过 25 条记录/秒的数据。 我需要每秒至少 5000 条记录。
我使用以下连接来恢复下载: connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); co
我是一名优秀的程序员,十分优秀!