我有一个这样的函数。
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');
}
编辑:哇,不应该错过这个