Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用管道IO流_Java_Io - Fatal编程技术网

Java 如何使用管道IO流

Java 如何使用管道IO流,java,io,Java,Io,从和的文档中, 前者构成通信管道的接收端,后者是发送端。这形成了如下结构: A->PipedInputStream->PipedOutStream->B 我的问题是如何指定A和B是什么。我希望A是标准的输入流System.in,B是FileOutputStream。 如果我错了,请纠正我,但我认为管道流对象提供了一种将InputStream连接到OutputStream的方法。但是我没有看到任何方法可以将PipedInputStream连接到PipedOutStream以外的任何对象,反之亦然。

从和的文档中, 前者构成通信管道的接收端,后者是发送端。这形成了如下结构: A->PipedInputStream->PipedOutStream->B 我的问题是如何指定A和B是什么。我希望A是标准的输入流System.in,B是FileOutputStream。 如果我错了,请纠正我,但我认为管道流对象提供了一种将InputStream连接到OutputStream的方法。但是我没有看到任何方法可以将PipedInputStream连接到PipedOutStream以外的任何对象,反之亦然。

PipedInputStream和PipedOutStream用于在两个线程之间创建管道

通常情况下,您会执行以下操作:

创建一个PipedOutStream和一个PipedInputStream并将它们连接起来 启动一个写入PipeDoutpStream的线程 启动从PipedInputStream读取的线程 PipedInputStream和PipedOutStream用于在两个线程之间创建管道

通常情况下,您会执行以下操作:

创建一个PipedOutStream和一个PipedInputStream并将它们连接起来 启动一个写入PipeDoutpStream的线程 启动从PipedInputStream读取的线程
首先,沟通的方向是 A->PipedOutStream->PipedInputStream->B

无法将A或B设置为某些特定流。
A只是表示一个线程,该线程调用PipedOutStream的write方法来提交一些数据,然后将数据传输到PipedInputStream,另一个线程B可以使用read方法从中读取数据。

首先,通信的方向是 A->PipedOutStream->PipedInputStream->B

无法将A或B设置为某些特定流。
A只是表示一个线程,该线程调用PipedOutStream的write方法来提交一些数据,然后将数据传输到PipedInputStream,另一个线程B可以使用read方法从中读取数据。

您链接到的javadoc,但看起来好像您没有读取它

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

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

Thread A  →  PipedOutputStream  →  PipedInputStream  →  Thread B
正如您所看到的,我还通过显示A和B是线程(即代码,而不是其他流)对其进行了澄清

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

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

它们被称为管道,因为它的工作方式类似于一个程序可以写入标准输出,另一个程序可以从标准输入中读取,然后您可以使用|管道将两者连接起来,例如foo.exe | bar.exe将通过管道将foo程序的输出作为bar程序的输入

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

我希望A是标准的输入流System.in,B是FileOutputStream

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

//使用更新的NIO.2APIJava7+ Files.copySystem.in,path.getfilename,StandardCopyOption.REPLACE_现有; //将旧文件I/O API与transferTo Java 9一起使用+ 尝试FileOutputStream out=新建FileOutputStreamnew FileFileFileName{ 系统输入输出; } //使用旧文件I/O API和try with resources Java 7+ 尝试FileOutputStream out=新建FileOutputStreamnew FileFileFileName{ 字节[]buf=新字节[8192]; 对于int len;len=System.in.readbuf>0; out.writebuf,0,len; } //使用旧文件I/O API任何Java版本 FileOutputStream out=新文件输出流新文件名; 试一试{ 字节[]buf=新字节[8192]; 对于int len;len=System.in.readbuf>0; out.writebuf,0,len; }最后{ 关上; }
您链接到的javadoc,但似乎您没有阅读它

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

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

Thread A  →  PipedOutputStream  →  PipedInputStream  →  Thread B
正如您所看到的,我还通过显示A和B是线程(即代码,而不是其他流)对其进行了澄清

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

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

它们被称为管道,因为它的工作方式类似于一个程序可以写入标准输出,另一个程序可以从标准输入中读取,然后您可以使用|管道将两者连接起来,例如foo.exe | bar.exe将通过管道将foo程序的输出作为bar程序的输入

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

我希望A是标准的输入流System.in,B是FileOutputStream

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

//使用更新的NIO.2APIJava7+ Files.copySystem.in,path.getfilename,StandardCopyOption.REPLACE_现有; //将旧文件I/O API与transferTo Java 9一起使用+ 尝试FileOutputStream out=新建FileOutputStreamnew FileFileFileName{ 系统输入输出; } //使用旧文件I/O API和try with resources Java 7+ 尝试FileOutputStream out=新建FileOutputStreamnew FileFileFileName{ 字节[]buf=新字节[8192]; 对于int len;len=System.in.readbuf>0; out.writebuf,0,len; } //使用旧文件I/O API任何Java版本 FileOutputStream out=新文件输出流新文件名; 试一试{ 字节[]buf=新字节[8192]; 对于int len;len=System.in.readbuf>0; out.writebuf,0,len; }最后{ 关上; }
调用InputStream.transferTo后,可以在以后撤消此方法的效果。@febot创建文件的撤消操作将删除它,因此。。。。是 啊我不是这个意思。我问是否有办法阻止System.in将其数据传输到指定的OutputStream。调用System.in.transferTo…,在调用transferTo方法之前,是否有方法将System.in返回到它所处的状态。@febot否,您必须编写自己的复制循环,如回答中所示,然后在要复制的数据中查找某个数据结束标记。调用InputStream.transferTo后,可以撤消此方法稍后的效果。@febot创建文件的撤消操作是删除它,因此。。。。是 啊我不是这个意思。我问是否有办法阻止System.in将其数据传输到指定的OutputStream。在调用System.in.transferTo…,之后,在调用transferTo方法之前,是否有办法将System.in返回到它所处的状态。@febot否,您必须编写自己的复制循环,如回答中所示,然后在被复制的数据中查找某个数据结束标记。