java中的管道I / O流

时间:2014-06-22 05:09:41

标签: java

我无法理解java中管道输入/输出流的用途。如果我使用输出流写东西,我可以使用输入流再次读取它。

那么管道流的需求是什么?

3 个答案:

答案 0 :(得分:0)

我认为它应该用于在多线程应用程序中进行读写。您可以在线程中写入并在另一个线程中读取,而无需刷新数据。

答案 1 :(得分:0)

Java IO 中的

管道提供了在同一JVM中运行的两个线程进行通信的能力。因为这样的管道是数据的共同来源或目的地。

PipedInputStream应与PipedOutputStream相关联。因此,一个线程写入PipedOutputStream的数据可以通过另一个线程从连接的PipedInputStream读取

普通Java IO不支持从多个线程流式传输到同一个流。

答案 2 :(得分:0)

简短动机:

  1. 关注点分离(总是很好-在这种情况下,它有助于将您的代码分成读写部分)
  2. 多线程(先前的点导致“容易”(从来都不容易:D)并行化)

详细说明/示例:

假设您有类似“生产者-消费者”的应用程序。您的代码中只有一部分可以生成输出,并且想要为其提供写入数据的地方。例如:

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”(产生)转换为可写流,并“压缩/验证”(使用)它,等等。

也许有更好的例子,但我个人如上所述将这些管道用于生产者-消费者的工作。