我从以下网络代码中得到BufferedReader
。
URL url = new URL(request);
HttpURLConnection httpUrlConnection = (HttpURLConnection)url.openConnection();
InputStream inputStream = httpUrlConnection.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
- 我想知道,哪种方式在执行速度方面效率更高?
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() 都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。