Ren*_*ndy 147 java android input stream bufferedreader
我正在为我正在制作的Android应用程序的网站发出HTTP get请求.
我正在使用DefaultHttpClient并使用HttpGet发出请求.我得到实体响应,从中获取一个InputStream对象来获取页面的html.
然后我循环完成回复,如下所示:
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
String x = "";
x = r.readLine();
String total = "";
while(x!= null){
total += x;
x = r.readLine();
}
Run Code Online (Sandbox Code Playgroud)
然而,这非常缓慢.
这效率低吗?我没有加载一个大的网页 - www.cokezone.co.uk所以文件大小不大.有一个更好的方法吗?
谢谢
安迪
Jai*_*ano 344
代码中的问题是它创建了大量繁重的String
对象,复制其内容并对其执行操作.相反,您应该StringBuilder
避免String
在每个追加上创建新对象,并避免复制char数组.您的案例的实现将是这样的:
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder total = new StringBuilder();
for (String line; (line = r.readLine()) != null; ) {
total.append(line).append('\n');
}
Run Code Online (Sandbox Code Playgroud)
您现在可以使用total
而无需将其转换为String
,但如果您需要将结果作为a String
,则只需添加:
字符串结果= total.toString();
我会试着更好地解释一下......
a += b
(或a = a + b
),在哪里a
和b
是字符串,复制两者 的内容a
和 b
一个新的对象(请注意,您也在复制a
,其中包含累积的 String
),并且您在每次迭代时都要复制这些副本.a.append(b)
,其中a
是a StringBuilder
,直接将b
内容附加到a
,因此您不会在每次迭代时复制累积的字符串.Mak*_*san 33
您是否尝试过内置方法将流转换为字符串?它是Apache Commons库(org.apache.commons.io.IOUtils)的一部分.
然后你的代码就是这一行:
String total = IOUtils.toString(inputStream);
Run Code Online (Sandbox Code Playgroud)
它的文档可以在这里找到:http: //commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#toString%28java.io.InputStream%29
可以从这里下载Apache Commons IO库:http: //commons.apache.org/io/download_io.cgi
And*_*rey 15
番石榴的另一种可能性:
依赖性: compile 'com.google.guava:guava:11.0.2'
import com.google.common.io.ByteStreams;
...
String total = new String(ByteStreams.toByteArray(inputStream ));
Run Code Online (Sandbox Code Playgroud)
小智 8
我相信这很有效......要从InputStream获取String,我会调用以下方法:
public static String getStringFromInputStream(InputStream stream) throws IOException
{
int n = 0;
char[] buffer = new char[1024 * 4];
InputStreamReader reader = new InputStreamReader(stream, "UTF8");
StringWriter writer = new StringWriter();
while (-1 != (n = reader.read(buffer))) writer.write(buffer, 0, n);
return writer.toString();
}
Run Code Online (Sandbox Code Playgroud)
我总是使用UTF-8.当然,除了InputStream之外,您还可以将charset设置为参数.
那这个呢.似乎可以提供更好的性能.
byte[] bytes = new byte[1000];
StringBuilder x = new StringBuilder();
int numRead = 0;
while ((numRead = is.read(bytes)) >= 0) {
x.append(new String(bytes, 0, numRead));
}
Run Code Online (Sandbox Code Playgroud)
编辑:实际上这种情况包括钢铁和莫里斯佩里的
归档时间: |
|
查看次数: |
246463 次 |
最近记录: |