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

java中高效的输入流到字符串方法,java,optimization,Java,Optimization,因此,我在Java应用程序上运行了一个探查器(当然相当简单),我惊讶地发现,在时间上仅次于需要发出HTTP请求的方法的是我的inputStreamToString方法。它目前的定义如下: public static String inputStreamToString(InputStream in) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(in));

因此,我在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();
}

我怎样才能使它更快?(是的,我确实需要字符串,不,输入字符串没有那么大,不,这个方法被调用的频率比程序中的大多数方法都要低,而且不,我没有办法避免转换的需要。)

好吧,这就是所有I/O发生的地方(我假设探查器包含所有时间readLine()等待数据输入所需的时间)。您可以做的唯一明显的事情是使用足够大的缓冲区对StringBuilder进行预初始化,这样它就不必重新分配内存,但我认为读取数据所需的时间会使一切变得微不足道

除此之外,您受I/O约束。通过网络接收数据只需要时间

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

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

我相信它可以更快


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

好吧,这就是所有I/O发生的地方(我假设探查器包含readLine()等待数据进入所需的所有时间)。您可以做的唯一明显的事情是使用足够大的缓冲区预初始化StringBuilder,这样它就不必重新分配内存,但我想,与读取数据所需的时间相比,一切都变得微不足道了。@EboMike已经非常清楚了。除此之外,,我唯一能想到的另一件事是跳过
BufferedReader
并提供您自己的缓冲区来读入——这也可以节省
readLine
调用,因为您真的不在乎一次只读一行。我想我还可以将其转换为答案:)除非您想转换换行符或解析它所做的行逐行阅读没有多大意义。我宁愿通过固定大小的缓冲区逐字符读取:gist.github.com/fkirc/a231c817d582e114e791b77bb33e30e9