如何更快地阅读 BufferedReader
Posted
技术标签:
【中文标题】如何更快地阅读 BufferedReader【英文标题】:How to read BufferedReader faster 【发布时间】:2011-06-07 16:40:23 【问题描述】:我要优化这段代码:
InputStream is = rp.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String text = "";
String aux = "";
while ((aux = reader.readLine()) != null)
text += aux;
问题是我不知道如何读取 bufferedreader 的内容并将其复制到 String 中,速度比我上面的要快。 我需要花尽可能少的时间。 谢谢
【问题讨论】:
您可以使用 StringBuilder 作为初学者。它将避免字符串的连接。您也可以对大型 char 数组使用 read 方法,但要获得最佳数组大小将需要一些基准测试。 你确定不用放回readLine()取出的换行码吗? LOL 表示“我需要花尽可能少的时间”。我认为这意味着它需要尽可能高效,但我将其解读为“我希望做尽可能少的工作以达到最佳结果。” 另见:***.com/questions/2980805/… 【参考方案1】:在循环中使用字符串连接是经典的性能杀手(因为字符串是不可变的,所以每次连接都会复制整个越来越大的字符串)。改为这样做:
StringBuilder builder = new StringBuilder();
String aux = "";
while ((aux = reader.readLine()) != null)
builder.append(aux);
String text = builder.toString();
【讨论】:
假设 java 1.5 或更高版本。否则,您将使用 StringBuffer。 值得指出的是 readLine 使用换行符。这个循环不会很有用,除非你想把所有的文本变成一行(在换行符的地方没有分隔符) @Greg:甚至 Java 5 在一年多前就超过了 EOSL 日期。是时候停止在涉及更旧版本的问题上浪费脑力了。 @Greg:我是说这是一个假设,在这个时代,每个人都应该毫不犹豫地做出,除非有明确的信息与之相矛盾。 鉴于 Java 1.5 已停止支持,Java 1.6 已停止使用,因此可以安全地假设您的编译器是 Java 1.6 或 1.7(可能是 1.5),但不太可能是 1.4 或事先的。我会说使用 StringBuilder 非常安全。【参考方案2】:你可以试试Apache IOUtils.toString。他们就是这样做的:
StringWriter sw = new StringWriter();
char[] buffer = new char[1024 * 4];
int n = 0;
while (-1 != (n = input.read(buffer)))
sw.write(buffer, 0, n);
String text = sw.toString();
【讨论】:
需要更多的支持,可能比逐行阅读要好,尤其是在行很短的情况下。见***.com/questions/2980805/…【参考方案3】:BufferedReader
从Socket读取时,需要加上bufferedReader.ready()
:
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuilder sb= new StringBuilder();
String line = "";
while (br.ready() && (line = br.readLine()) != null)
sb.append(line + "\r\n");
String result = sb.toString();
【讨论】:
【参考方案4】:一条线解决方案:
String result = reader.lines().collect(joining(lineSeparator()));
进口:
import java.io.*;
import static java.lang.System.lineSeparator;
import static java.util.stream.Collectors.joining;
【讨论】:
【参考方案5】:我使用 StringBuilder 和 While 循环编写了一个简单的函数来执行此操作,并在其中捕获 IOException。
public String getString(BufferedReader bufferedReader)
StringBuilder stringBuilder = new StringBuilder();
String line = null;
do
try
if ((line = bufferedReader.readLine()) != null)
stringBuilder.append(line).append(System.lineSeparator());
catch (IOException e)
e.printStackTrace();
while (line != null);
return stringBuilder.toString();
【讨论】:
【参考方案6】:您可以使用StringBuffer
while ((aux = reader.readLine()) != null)
stringBuffer.append(aux);
【讨论】:
@dogbane StringBuffer 在需要同步时不是更好吗? @735Tesla 看到这个link以上是关于如何更快地阅读 BufferedReader的主要内容,如果未能解决你的问题,请参考以下文章