我无法理解java中管道输入/输出流的用途。如果我使用输出流写东西,我可以使用输入流再次读取它。
那么管道流的需求是什么?
答案 0 :(得分:0)
我认为它应该用于在多线程应用程序中进行读写。您可以在线程中写入并在另一个线程中读取,而无需刷新数据。
答案 1 :(得分:0)
管道提供了在同一JVM中运行的两个线程进行通信的能力。因为这样的管道是数据的共同来源或目的地。
PipedInputStream
应与PipedOutputStream
相关联。因此,一个线程写入PipedOutputStream
的数据可以通过另一个线程从连接的PipedInputStream
读取
普通Java IO不支持从多个线程流式传输到同一个流。
答案 2 :(得分:0)
简短动机:
详细说明/示例:
假设您有类似“生产者-消费者”的应用程序。您的代码中只有一部分可以生成输出,并且想要为其提供写入数据的地方。例如:
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”(产生)转换为可写流,并“压缩/验证”(使用)它,等等。
也许有更好的例子,但我个人如上所述将这些管道用于生产者-消费者的工作。