这是从缓冲阅读器获取字符串的更好方法



我从以下网络代码中得到BufferedReader

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

        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);
        }

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

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

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

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

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

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

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

根据 java 文档

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

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

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

最新更新