如何更快地阅读BufferedReader

Cat*_*ata 33 java optimization bufferedreader

我想优化这段代码:

InputStream is = rp.getEntity().getContent();      

BufferedReader reader = new BufferedReader(new InputStreamReader(is));

String text = "";
String aux = "";

while ((aux = reader.readLine()) != null) {
        text += aux;
      }
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何读取bufferedreader的内容并以比我上面更快的方式将其复制到String中.我需要花费尽可能少的时间.谢谢

Mic*_*rdt 82

在循环中使用字符串连接是经典的性能杀手(因为字符串是不可变的,整个越来越大的字符串被复制为每个连接).改为:

StringBuilder builder = new StringBuilder();
String aux = "";

while ((aux = reader.readLine()) != null) {
    builder.append(aux);
}

String text = builder.toString();
Run Code Online (Sandbox Code Playgroud)

  • 值得指出的是readLine消耗换行符.除非您想将所有文本转换为一行(没有以前换行的sperator),否则此循环不会非常有用 (9认同)
  • @Greg:甚至Java 5也超过了一年前的EOSL日期.现在是时候停止在甚至更老版本的问题上浪费心理能力. (6认同)
  • 这是假设java 1.5或更高版本.否则它将是您将使用的StringBuffer. (4认同)
  • @Greg:我说这是一个假设,在这个时代,每个人都应毫不犹豫地做出,除非有明确的信息与之相矛盾. (3认同)
  • 由于Java 1.5中是支持结束,和Java 1.6是生命的尽头,它是安全的假设,你的编译器就是Java 1.6或1.7(也许1.5),但不太可能是1.4或之前.我会说使用StringBuilder是非常安全的. (2认同)

dog*_*ane 26

您可以尝试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();
Run Code Online (Sandbox Code Playgroud)


mic*_*alv 6

BufferedReader从套接字中,有必要补充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();
Run Code Online (Sandbox Code Playgroud)