我无法理解Java中通过管道传输I / O流的目的。如果我使用输出流编写某些内容,则无论如何都可以使用输入流再次读取它。
那么,对管道流的需求是什么?
简短的动机:
详细说明/示例:
假设您有类似“生产者-消费者”的应用程序。您的代码中只有一部分可以生成输出,并且想要为其提供写入数据的地方。例如:
void generateLines(int numberOfLines, OutputStream target);
该组件只有一个责任,即它“产生”行,并且不知道将行写入何处。您只需将其称为generateLines(5, System.out)
或即可generateLines(100, fileOutputStream)
。但是,想象一下您想组装“管道”,即您不想存储/打印数据,而是想将它们传递给另一个组件“消费者”。
您可以使用带有如下签名的组件:
int countLines(InputStream source);
唯一要做的就是读取InputStream
外部提供的数据。
现在,借助“ Piped”流,您可以通过创建“ pipe”将这两个组件粘合在一起:
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream(pos, 1024);
然后,您可以运行两个线程,一个线程生成数据,另一个线程使用它们。Pipe api非常方便,读/写很阻塞(有关更多详细信息,请参见javadoc),因此用法非常简单/方便。
// Withing main thread start generating of x lines into pos OutputStream
generateLines(50000, pos);
// Spawn new thread within which we consume pipe from its InputStream end
Executors.newCachedThreadPool().submit(() -> {
pis.read();
// The rest of "reading-loop" omitted for sake of simplicity...
});
当然,这个示例是虚拟的,但是可以轻松地想象一些用例,例如“生成巨大的xml”(产生)到可写流中以及“压缩/验证”(使用)它,等等。
也许有更好的例子,但我个人如上所述将这些管道用于生产者-消费者的工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句