如何使用管道式IO流

费伯特

从文档PipedInputStreamPipedOutputStream,前者形成连通管的接收端,而后者是在发送端。这形成了这样的结构:
A-> PipedInputStream-> PipedOutputStream-> B
我的问题是如何指定A和B是什么。我想A是一标准的输入流System.in和B是一个FileOutputStream
如果我错了,请指正我,但是我认为Piped Stream对象提供了一种将an连接InputStream到的方法OutputStream但是,我看不到将a连接PipedInputStream到除a以外的任何方法的方法,PipedOutputStream反之亦然。

安德烈亚斯

您已链接到的javadoc PipedOutputStream,但似乎您没有看过它。

管道输出流可以连接到管道输入流以创建通信管道。传送输出流是发送端的管道。典型地,数据被写入到PipedOutputStream由一个线程对象和数据被从连接的读出PipedInputStream通过一些其它线程

因此,数据与问题显示的方向相反:

Thread A  →  PipedOutputStream  →  PipedInputStream  →  Thread B

如您所见,我还通过显示AB线程(即代码,而不是其他流)进行了澄清


如果我错了,请指正我,但是我认为Piped Stream对象提供了一种将an连接InputStream到的方法OutputStream

从上面的描述可以看出,您对此有误。管道流对象为线程使用流I / O调用将数据发送到另一个线程提供了一种方法。

它们之所以称为“管道式”,是因为它的工作方式类似于一个程序可以写入stdout,而另一个程序可以从stdin读取数据,然后您可以使用|管道连接两者,例如,foo.exe | bar.exe将管道foo程序的输出作为输入传递给bar程序。

那只是在进程之间,而管道流在线程之间


我想A成为标准输入流,System.inB成为FileOutputStream

如果要复制System.in到文件,可以执行以下任一操作:

// Using newer NIO.2 API (Java 7+)
Files.copy(System.in, Paths.get(filename), StandardCopyOption.REPLACE_EXISTING);
// Using old File I/O API with transferTo (Java 9+)
try (FileOutputStream out = new FileOutputStream(new File(filename))) {
    System.in.transferTo(out);
}
// Using old File I/O API with try-with-resources (Java 7+)
try (FileOutputStream out = new FileOutputStream(new File(filename))) {
    byte[] buf = new byte[8192];
    for (int len; (len = System.in.read(buf)) > 0; )
        out.write(buf, 0, len);
}
// Using old File I/O API (any Java version)
FileOutputStream out = new FileOutputStream(new File(filename));
try {
    byte[] buf = new byte[8192];
    for (int len; (len = System.in.read(buf)) > 0; )
        out.write(buf, 0, len);
} finally {
    out.close();
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用大文件,NodeJS流和管道

来自分类Dev

Java中的管道式I / O流

来自分类Dev

使用superagent管道可读流

来自分类Dev

使用superagent管道可读流

来自分类Dev

如何使用隐式流生成Instagram访问令牌?

来自分类Dev

如何使用jenkins工作流/管道动态生成并行作业

来自分类Dev

如何使用Jenkins WorkFlow通过多个管道创建复杂的价值流

来自分类Dev

如何在Jenkins声明式管道中使用节流并发构建

来自分类Dev

如何使用 jenkins 声明式管道添加条件构建后操作?

来自分类Dev

使用 IO::Pipe Perl 管道 STDERR

来自分类Dev

如何使用Play框架将流内联显示为HTTP块式响应

来自分类Dev

使用 OpenId Connect 隐式流时如何保护客户端中的令牌

来自分类Dev

使用分布式缓存-HIVE流

来自分类Dev

使用分布式缓存-HIVE流

来自分类Dev

如何从Zombie.js流/管道响应对象

来自分类Dev

节点-如何通过管道传输到新的READABLE流?

来自分类Dev

使用管道4.0折叠流的子集

来自分类Dev

映射文件中的IO与使用文件流的IO

来自分类Dev

如何使用内存流而不是文件流

来自分类Dev

管道如何限制内存使用?

来自分类Dev

管道如何限制内存使用?

来自分类Dev

如何使用Perl建立管道

来自分类Dev

如何使用管道输出avconv

来自分类Dev

管道中的模型流

来自分类Dev

NodeJS流-泄漏的管道?

来自分类Dev

来自“托管”管道的流

来自分类Dev

来自“托管”管道的流

来自分类Dev

如何将hawt.io与Spring Boot和嵌入式Jetty结合使用

来自分类Dev

如何区分管道和交互式标准输入