我有一个像这样的功能。
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?这有什么好处?
答案 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');
}
编辑:哇,不应该错过那个。