管道输入输出流不同于普通文件的输入/输出流等,他们用于线程之间的数据传输,传输媒介是内存。 使用demo:
import java.io.IOException; import java.io.PipedReader; import java.io.PipedWriter; /** * 管道输入输出流,用于线程之间的数据传输,传输媒介是内存 */ public class Piped { //用于打印的线程任务,这个任务中有一个PipedReader属性,该类专门把那些写的数据读取出来 static class Print implements Runnable { /** * 管道读取流,作用于字符 */ private PipedReader pipedReader; public Print(PipedReader pipedReader) { this.pipedReader = pipedReader; } /** * 这里的run方法逻辑要做的就是,一直读取写入的数据,然后把它们打印在控制台上 */ @Override public void run() { int receive = 0; try { while (((receive = pipedReader.read()) != -1)) { System.out.print((char) receive); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { //管道字符写入和读取流 PipedWriter pipedWriter = new PipedWriter(); PipedReader pipedReader = new PipedReader(); //将管道字符写入和读取流做一个连接,防止使用时抛出IOException异常,同时做个绑定读取流才能知道从哪个写入流读取数据 pipedWriter.connect(pipedReader); //创建一个读取数据的线程并启动 Thread printThread = new Thread(new Print(pipedReader)); printThread.start(); //把控制台上的数据填充进写入流,这样读取流线程就可以把绑定的写入流的数据输出到控制台了 int receive = 0; try { while ((receive = System.in.read()) != -1) { pipedWriter.write(receive); } } finally { pipedWriter.close(); } } }测试结果:
总结
可以发现,每次在控制台输入的数据,控制台都会再次打印出一模一样的数据,线程之间实现了数据的输入和输出。