哪个是从BufferedReader获取字符串的更好方法

时间:2012-06-15 18:35:08

标签: java android

我从以下网络代码中获得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);
        }
    

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

3 个答案:

答案 0 :(得分:1)

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

在第二种方法中,您假设流中有新的行字符。在20MB json的情况下优化的方式是什么,没有新的行字符?这会打击你的应用程序。

  

一条线被认为是由换行符('\ n'),回车符('\ r')或回车符后面的任何一个终止。

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

答案 1 :(得分:1)

使用StringBuilder被认为是StringBuffer的更好替代方案,除非您需要使用同步StringBuffer的开销。 (StringBuilder是替代品)

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

答案 2 :(得分:0)

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

根据java doc

  

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

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

  

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