java中字符串方法的高效输入流

时间:2010-11-26 21:11:56

标签: java optimization

所以我在Java上运行了一个探测器(我公认的非常简单)应用程序,并且很惊讶第二种只需要按时间发出HTTP请求的方法就是我的inputStreamToString方法。它目前的定义如下:

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();
}

如何让它更快? (是的,我确实需要字符串,不,输入字符串不是那么大,不,这个方法的调用频率比程序中的大多数方法要少,不,我没有办法避免这种需要转换。)

3 个答案:

答案 0 :(得分:5)

嗯,这就是所有I / O发生的地方(我假设分析器包含readLine()等待数据进入的所有时间)。你可以做的唯一显而易见的事情就是用一个足够大的缓冲区预先初始化StringBuilder,这样它就不必重新分配内存了,但我认为一切都因读取数据所需的时间而相形见绌。

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

编辑:也可以包括卡萨布兰卡的评论:除了逐行阅读然后添加换行符之外,您还可以使用一个简单的阅读器,它具有您提供的相当大的缓冲区,并且只是阻止读取所有内容。因为您似乎只是复制整个输入数据,所以无需逐行读取。手动逐行排序的唯一原因是,您希望将换行符(例如\r\n)规范化为标准\n

答案 1 :(得分:0)

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

我相信它会更快......

但是你的代码看起来像是为了说明好的风格和良好的编码。我真的不明白这里可能有什么效果。可能需要时间,因为你的逻辑的其余部分相对简单并且编写得很好?我的意思是,尽管这段代码需要相对较长的时间,但这并不是太关键?

答案 2 :(得分:0)

检查此[链接文字] [1] 那里有很多建议。

[1]:Read/convert an InputStream to a String Stackoverflow-InputStream2String