从文档PipedInputStream
和PipedOutputStream
,前者形成连通管的接收端,而后者是在发送端。这形成了这样的结构:
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
如您所见,我还通过显示A
和B
是线程(即代码,而不是其他流)进行了澄清。
如果我错了,请指正我,但是我认为Piped Stream对象提供了一种将an连接
InputStream
到的方法OutputStream
。
从上面的描述可以看出,您对此有误。管道流对象为线程使用流I / O调用将数据发送到另一个线程提供了一种方法。
它们之所以称为“管道式”,是因为它的工作方式类似于一个程序可以写入stdout,而另一个程序可以从stdin读取数据,然后您可以使用|
管道连接两者,例如,foo.exe | bar.exe
将管道foo
程序的输出作为输入传递给bar
程序。
那只是在进程之间,而管道流在线程之间。
我想
A
成为标准输入流,System.in
并B
成为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] 删除。
我来说两句