2015-07-19 127 views
0

我正尝试使用HttpsURLConnection从服务器读取响应。优化BufferedReader readLine()操作

InputStreamReader in = new InputStreamReader((InputStream) con.getContent()); 
    BufferedReader buff = new BufferedReader(in); 

    String line; 
    StringBuilder response=new StringBuilder(); 
    long st=System.nanoTime(); 

    while ((line =buff.readLine())!= null) { 
     response=response.append(line +"\n"); 

    } 

    long et=System.nanoTime(); 
    System.out.println("resp process time: "+((et-st))+" ns"); 
    return response.toString(); 
} 

目前,大约需要450毫秒来读取整个约80000个字符(1100行)的响应。

输出:RESP处理时间:435272240纳秒

是否可以进一步优化该代码,以减少处理时间?

+0

的可能重复【JAVA:如何看的BufferedReader更快(http://stackoverflow.com/questions/4666748/java-how-to-read-bufferedreader-faster) – 2015-07-19 12:20:14

+0

@OSryx不完全重复,因为这里使用了一个'StringBuilder'。 – RealSkeptic

回答

1

您创建了一个不必要的临时字符串line + "\n"。你可以避免这一点。

while ((line = buff.readLine()) != null) { 
    response.append(line).append('\n'); 
} 

您还可以避免BufferedReader(无需扫描输入以查找换行符)。

InputStreamReader in = ... 
char buffer[] = new char[8192]; 
int count; 
while ((count = in.read(buffer)) != -1) 
    response.append(buffer, 0, count); 
+0

对于使用char []而不是'BufferedReader'的部分+1。如果您没有对每一行进行任何处理,我个人更喜欢这个选项。如果输入大小太大,可能会导致问题:P – TheLostMind

+0

来自服务器的响应大小不固定,并且可能与每个请求大不相同,所以此解决方案是正确的,但不适用于此特定场景 – Akki

+0

@Akki:BufferedReader也具有默认值8192个字符的缓冲区,因此两种解决方案的内存特征都相同。当然,如果响应发送内容长度标题和编码,则可以估计响应缓冲区的大小以及用于复制的任何临时缓冲区。 – wero