Java字符串vs流



我有一个这样的函数。

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

是否有一种方法来返回流而不是整个字符串?这样做的好处是什么?

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

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

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

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


如果您想返回字符流,您可以简单地返回BufferedReader实例。如果大多数情况下从Reader返回二进制流是有意义的,但如果这个必需的,那么阅读这个答案。

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

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

最后,如果您一次需要整个文件,您最好返回字符串

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

你最好像这样使用StringBuilder:

StringBuilder sb = new StringBuilder();
while(outReaderOutput.hasMoreLines())
{
    sb.append(outReaderOutput.readLine()).append('n');
}

编辑:哇,不应该错过这个

相关内容

  • 没有找到相关文章

最新更新