4

BufferedReader从以下网络代码中获得。

    URL url = new URL(request);
    HttpURLConnection httpUrlConnection = (HttpURLConnection)url.openConnection();
    InputStream inputStream = httpUrlConnection.getInputStream();
    bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
  1. 我想知道,哪种方式在执行速度方面效率更高?
  2. 1024尺寸是Android的好选择吗?或者,我可以使用任何系统常量值吗?

        int charRead = 0;
        char[] buffer = new char[1024];
        StringBuffer stringBuffer = new StringBuffer();
        while ((charRead = bufferedReader.read(buffer)) > 0) {
            stringBuffer.append(buffer, 0, charRead);
        }
    

        String line = "";
        StringBuffer stringBuffer = new StringBuffer();
        while ((line = bufferedReader.readLine()) != null) {
            stringBuffer.append(line);
        }
4

3 回答 3

1

除非您需要使用 synchronized 的开销,否则usingStringBuilder被认为是更好的选择。(是替代品的下降)StringBufferStringBufferStringBuilder

至于性能,我会采用第一种方法并避免使用readLine(),除非您需要将该行作为一行文本处理。此外,readLine()不会返回实际的换行符,因此您在第二个示例中创建的数据将缺少换行符,因此可能与从服务器传输的数据不完全相同。

于 2012-06-15T19:08:03.557 回答
1

我认为第一种方法更有效,但我宁愿设置更高的缓冲区大小。8*1024。这是 HttpClient 中的默认 CoreConnectionPNames.SOCKET_BUFFER_SIZE。我宁愿说低于 8*1024 的东西是不合理的,因为大多数 HTTP 缓冲区都设置为 8*1024。

在第二种方法中,您假设流中有换行符。如果以没有换行符的方式优化 20MB json 怎么办?这会炸毁你的应用程序。

一行被认为是由换行符 ('\n')、回车符 ('\r') 或紧跟换行符的回车符中的任何一个终止的。

在我看来,最好的选择是使用 8*1024 的乘法。上限受限于内存大小和连接速度相对于流的缓冲区处理时间。

于 2012-06-15T18:44:07.157 回答
0

可以设置更高的缓冲区限制将是最好的选择。

根据 java 文档

可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

缓冲是更好的方法。再次按照文档

如果没有缓冲,每次调用 read() 或 readLine() 都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。

于 2012-06-15T18:40:22.327 回答