Java String vs Stream

时间:2015-07-29 15:48:14

标签: java stream

我有一个像这样的功能。

try {
    Process p = runtime.exec(fullCommand, null);

    BufferedReader outReaderOutput = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = outReaderOutput.readLine();
    String output = "";

    while (line != null) {
        output += line + "\n";
        line = outReaderOutput.readLine();
    }
    return output;
} catch (IOException e) {
    throw new RuntimeException(e);
}

有没有办法返回Stream而不是整个String?这有什么好处?

3 个答案:

答案 0 :(得分:3)

字符串基本上存储在内存中;它的内容在您收到String实例时完全可用。您可以直接搜索字符串或查找其他信息 - 例如字符串的长度。

如果您收到Reader实例,则您不知道字符串的大小,并且许多功能(如搜索)都不是(直接)可用的。另一方面,您不需要将整个字符串存储在内存中。

此外,在您收到Reader实例时,并非所有内容都需要。一个很好的例子是通过套接字接收文本;您可能希望在收到内容时处理部分内容,而不是在收到完整邮件后处理。

应用程序的完整输出 - 在您的示例代码中 - 也可能无法直接使用;你的方法会阻塞(直到你的fullCommand应用程序退出)。

如果要返回字符流,只需返回BufferedReader实例即可。如果在大多数情况下从Reader返回二进制流是有意义的,但如果此 需要read this answer

编辑:如果你只需要二进制文件,你当然应该在你的例子中直接返回p.getInputStream()

答案 1 :(得分:2)

您可以轻松返回p.getInputStream() 这取决于您的实施。

答案 2 :(得分:1)

最后,如果您需要立即使用整个文件,最好还是返回字符串

就目前而言,我不认为Java编译器可以将其优化为StringBuilder,它基本上允许分摊的常量时间字符串连接。

你最好使用像这样的StringBuilder:

StringBuilder sb = new StringBuilder();
while(outReaderOutput.hasMoreLines())
{
    sb.append(outReaderOutput.readLine()).append('\n');
}
编辑:哇,不应该错过那个。