Java 字符串与流

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

有没有办法返回流而不是整个字符串?这样做有什么好处?

最佳答案

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

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

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

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


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

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

关于Java 字符串与流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31705248/

相关文章:

java - 是否可以从 Intellij 插件内部使用 FileDialog?

java - 在本地使用 HANA 数据库运行 Java Web 应用程序

c++ - 下面的代码是如何工作的?

node.js - 套接字流对话的 Node.js 范例是什么?

node.js - 通过管道将二进制文件从 stdout 传输到 http 响应

delphi - 对于大字符串,TSQLQuery 仅正确传输前 1MB 数据

java - int 作为 boolean 表达式 Eclipse-Java

java - Chronicle中Java9Memory来源

java - "\u001B[J"代表什么?

c++ - c++中从右边读取流