Java中的管道式I / O流

沙申克·古普塔(Shashank Gupta)

我无法理解Java中通过管道传输I / O流的目的。如果我使用输出流编写某些内容,则无论如何都可以使用输入流再次读取它。

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

svobol13

简短的动机:

  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”(产生)到可写流中以及“压缩/验证”(使用)它,等等。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

管道<I / O>流。我可以传递复杂的物体吗?

来自分类Dev

如何在 Java 中关闭嵌套的 I/O 流

来自分类Dev

管道中的模型流

来自分类Dev

标准I / O流-fgets()缓冲类型

来自分类Dev

在关闭挂钩期间关闭I / O流

来自分类Dev

使用I / O流的分段错误

来自分类Dev

I / O流标志如何工作?

来自分类Dev

标准I / O流-fgets()缓冲类型

来自分类Dev

使用Java I / O通过HTTP网络读取流

来自分类Dev

Java套接字I / O流空指针异常

来自分类Dev

与I / O中的流的缓冲区链接

来自分类Dev

如何使用管道式IO流

来自分类Dev

符号表达式流I / O

来自分类Dev

I / O流与外部设备之间的关系是什么

来自分类Dev

提高I / O绑定张量流训练速度

来自分类Dev

如何知道哪些程序支持流I / O

来自分类Dev

无法正确读取文件-数据I / O流

来自分类Dev

发出命令时标准I / O流的状态是什么?

来自分类Dev

查找并替换h2o流中的数据行

来自分类Dev

Java中OIDC隐式代码流的示例代码

来自分类Dev

I /在读取输入消息O错误; 嵌套的例外是产生java.io.IOException:流关闭

来自分类Dev

澄清管道库中的流和效果

来自分类Dev

Gulp /管道中未处理的流错误

来自分类Dev

从管道HTTP流中删除标头

来自分类Dev

是否从akka I / o中删除了管道?

来自分类Dev

是否从akka I / o中删除了管道?

来自分类Dev

尽管byteval在write()中声明为整数,但为什么在Java I / O流中仅将低八位写入文件中

来自分类Dev

NodeJS流-泄漏的管道?

来自分类Dev

来自“托管”管道的流