首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用管道IO流

如何使用管道IO流
EN

Stack Overflow用户
提问于 2021-01-14 08:27:24
回答 3查看 1K关注 0票数 1

PipedInputStreamPipedOutputStream的文档来看,前者是通信管道的接收端,后者是发送端。这就形成了这样一个结构:

A -> PipedInputStream -> PipedOutputStream -> B

我的问题是如何具体说明什么是A和B。我希望A是标准输入流System.in,B是一个FileOutputStream

如果我错了,请纠正我,但我认为管道流对象提供了一种将InputStream连接到OutputStream的方法。然而,我没有看到任何将PipedInputStream连接到除PipedOutputStream之外的任何东西的方法,反之亦然。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-14 09:17:38

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

管道输出流可以连接到管道输入流以创建通信管道。管道输出流是管道的发送端。通常,数据是由一个线程( PipedOutputStream )写入对象的,而数据是由其他线程()从连接的中读取的。

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

代码语言:javascript
复制
Thread A  →  PipedOutputStream  →  PipedInputStream  →  Thread B

正如您所看到的,我还通过显示A B threads,,即代码,而不是其他流来澄清它。

如果我错了,

会纠正我的错误,但我认为管道流对象提供了一种将InputStream连接到OutputStream的方法。

你可以从上面的描述中看到,你错了。管道流对象为线程提供了一种使用Stream /O调用向另一个线程发送数据的方法。

它们被称为“管道”,因为它的工作方式类似于一个程序可以写到stdout,另一个程序可以从stdin读取,然后您可以使用|管道连接这两个程序,例如,foo.exe | bar.exe会将来自foo程序的输出作为bar程序的输入。

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

I希望A是标准输入流System.inBFileOutputStream

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

代码语言:javascript
复制
// Using newer NIO.2 API (Java 7+)
Files.copy(System.in, Paths.get(filename), StandardCopyOption.REPLACE_EXISTING);
代码语言:javascript
复制
// Using old File I/O API with transferTo (Java 9+)
try (FileOutputStream out = new FileOutputStream(new File(filename))) {
    System.in.transferTo(out);
}
代码语言:javascript
复制
// 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);
}
代码语言:javascript
复制
// 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();
}
票数 3
EN

Stack Overflow用户

发布于 2021-01-14 08:37:23

首先,沟通的方向是

A -> PipedOutputStream -> PipedInputStream -> B.

不可能将A或B设置为某些特定的流。

一个简单的线程表示一个线程,该线程调用PipedOutputStreamPipedOutputStream方法来提交一些数据,然后将该数据传输到另一个线程B可以使用read()方法读取数据的PipedInputStream

票数 4
EN

Stack Overflow用户

发布于 2021-01-14 08:36:58

PipedInputStreamPipedOutputStream用于在两个线程之间创建一个管道。

通常你会做这样的事情:

PipedOutputStream

  • Start

  • 创建一个PipedOutputStream和一个PipedInputStream,并将它们连接到

  • ,启动一个写到的线程,一个从PipedInputStream读取的线程
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65715627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档