代码之家  ›  专栏  ›  技术社区  ›  Aaron Yodaiken

Java中高效的流到串方法

  •  4
  • Aaron Yodaiken  · 技术社区  · 15 年前

    所以我在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 回复  |  直到 15 年前
        1
  •  5
  •   EboMike    15 年前

    好吧,这就是所有I/O发生的地方(我假设探查器包括readline()等待数据进入所需的所有时间)。你唯一能做的就是用足够大的缓冲区预先初始化StringBuilder,这样它就不必重新分配内存了,但是我认为所有的事情都会因为读取数据所花费的时间而变得微不足道。

    除此之外-您受I/O限制。通过网络接收数据只需要时间。

    编辑:也可以包括卡萨布兰卡的评论:与其逐行阅读然后添加新行,不如使用一个简单的阅读器,它有一个相当大的缓冲区,可以提供并阻止阅读所有内容。不需要逐行读取,因为您似乎只是复制整个输入数据。手动逐行执行的唯一理由是,如果您希望规范化换行(如 \r\n )达到标准 \n .

        2
  •  0
  •   AlexR    15 年前

    尝试使用jakarta commons中的ioutils.copy()。 创建bytearrayOutputstream,将httpRequest流中的字节复制到此bytearray,然后使用新字符串(bytes,“utf-8”)创建字符串。

    我相信会更快…

    但您的代码看起来是为了说明良好的风格和良好的编码而编写的。我真的不明白在这里什么可能如此无效。可能这需要时间,因为您的其他逻辑相对简单,并且写得很好?我的意思是,尽管这段代码花费的时间相对较长,但这不是太关键吗?

        3
  •  0
  •   Community Mohan Dere    8 年前

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

    〔1〕: Read/convert an InputStream to a String stackoverflow-inputstream2字符串