【发布时间】:2019-10-19 22:12:14
【问题描述】:
我使用一个接受 OutputStream 的 API(有关更多信息,请参见下文)来捕获数据。相反,我想提供一个 Consumer 的 Strings 一行一行地使用数据。因此,我必须编写一个包装了这样一个消费者的 OutputStream 实现。这是我能想到的最简单的:
import java.io.OutputStream;
import java.util.Objects;
import java.util.function.Consumer;
public class OutputStreamConsumer extends OutputStream {
private final Consumer<String> consumer;
private final StringBuilder sb = new StringBuilder();
public OutputStreamConsumer(Consumer<String> consumer) {
this.consumer = Objects.requireNonNull(consumer);
}
@Override
public void write(int b) {
char c = (char) b;
if (c == '\r') {
return;
}
if (c == '\n') {
consume();
return;
}
this.sb.append(c);
}
@Override
public void close() {
if (sb.length() != 0) {
consume();
}
}
private void consume() {
this.consumer.accept(this.sb.toString());
this.sb.delete(0, Integer.MAX_VALUE);
}
}
但是,就编码和性能而言,这对于生产代码来说可能还不够。我认为必要的逻辑已经包含在 InputStreamReader 和 BufferedReader 中,但我不能在这种情况下使用这些类。 编写这种 OutputStream 的最佳方法是什么?我可以使用哪些 jdk 类来避免编写一堆低级代码处理编码、行尾等。
具体用例
在 Gradle 插件项目中,我使用 Gradle 的项目 API:ExecSpec 启动了一个外部进程。在那里,我可以使用 setStandardOutput 和 setErrorOutput 方法设置 OutputStreams,以便捕获进程的输出。
【问题讨论】:
标签: java character-encoding outputstream