2010-11-26 68 views
4

所以我在我的Java(应该是非常简单的)应用程序上运行一个分析器,并且感到惊讶的是仅次于需要根据时间发出HTTP请求的方法是我的inputStreamToString方法。目前定义如下:有效的输入流到java中的字符串方法

public static String inputStreamToString(InputStream in) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
     sb.append(line).append("\n"); 
    } 
    in.close(); 
    return sb.toString(); 
} 

我该如何让这个更快? (是的,我确实需要字符串,并且不,InputStrings不是那么大,并且不,这种方法比程序中的大多数方法被调用的次数要少,不,我没有办法避免这种需要)

+1

嗯,这就是所有的I/O发生(我假设探查器包括所有的时间的readLine()需要等待数据进来)。你能做的唯一明显的事情就是用一个足够大的缓冲区预先初始化StringBuilder,这样它就不必重新分配内存,但我认为读取数据所花费的时间会让所有事情都变得很矮小。 – EboMike 2010-11-26 21:15:38

回答

5

那么,这就是所有I/O发生的地方(我假设分析器包含readLine()用来等待数据进入的所有时间)。你能做的唯一明显的事情就是用一个足够大的缓冲区预先初始化StringBuilder,这样它就不必重新分配内存,但我认为读取数据所花费的时间会让所有事情都变得很矮小。

除此之外 - 你是I/O绑定。通过网络接收数据只需要时间。

编辑:也可能包括卡萨布兰卡的评论:而不是一行一行阅读,然后添加一个换行符,你可能会使用一个简单的阅读器与你提供的合理的大缓冲区,只是块读取一切。无需逐行读取,因为您似乎只是复制整个输入数据。如果您想将新行标准化(如\r\n)为标准\n,则逐行手动执行的唯一原因是。

0

尝试从雅加达公共区使用IOUtils.copy()。 创建ByteArrayOutputStream,将HTTPRequest流中的字节复制到此ByteArray,然后使用新的String(字节,“UTF-8”)创建字符串。

我相信它可以更快...

但你的代码看起来它是书面说明良好的作风和良好的编码都没有。我真的不明白这里可能如此无效。可能需要时间,因为你的其他逻辑相对简单,写得很好?我的意思是,尽管这段代码需要相对多的时间,但这不是太重要吗?

相关问题