Java 如何使用管道IO流
从和的文档中, 前者构成通信管道的接收端,后者是发送端。这形成了如下结构: 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读取的线程Java 如何使用管道IO流,java,io,Java,Io,从和的文档中, 前者构成通信管道的接收端,后者是发送端。这形成了如下结构: A->PipedInputStream->PipedOutStream->B 我的问题是如何指定A和B是什么。我希望A是标准的输入流System.in,B是FileOutputStream。 如果我错了,请纠正我,但我认为管道流对象提供了一种将InputStream连接到OutputStream的方法。但是我没有看到任何方法可以将PipedInputStream连接到PipedOutStream以外的任何对象,反之亦然。
首先,沟通的方向是 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否,您必须编写自己的复制循环,如回答中所示,然后在被复制的数据中查找某个数据结束标记。