Java 管道PipedInputStream PipedOutStream PipedReader PipedWriter

Posted ShineYoung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 管道PipedInputStream PipedOutStream PipedReader PipedWriter相关的知识,希望对你有一定的参考价值。

java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而不必借助类似临时文件之类的东西。jdk提供4个类来使线程建可以进行通信。

(1)PipedInputStream与PipedOutputStream

(2)PipedReader与PipedWriter

PipedInputStream in = new PipedInputStream()

PipedOutStream out = new PipedOutStream()

in.connect(out)

//等同于out.connect(in)

管道输入流与管道输出刘是一一对应关系,如果说一对多或者多对对会报错

java.io.IOException: Already connected
    at java.io.PipedOutputStream.connect(PipedOutputStream.java:100)
    at java.io.PipedInputStream.connect(PipedInputStream.java:188)
    at extthread.PipedStreamTest.main(PipedStreamTest.java:27)

字节流输入(注意由于是字节流,要用到String的getBytes()方法),输入完成关闭管道

private void writeShortMessage() {
        String strInfo = "this is a short message" ;
        try {
            out.write(strInfo.getBytes());
            out.close();   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
    }

字节流输出

public void readMessageOnce(){
        // 虽然buf的大小是2048个字节,但最多只会从“管道输入流”中读取1024个字节。
        // 因为,“管道输入流”的缓冲区大小默认只有1024个字节。
        byte[] buf = new byte[2048];
        try {
            int len = in.read(buf);
            System.out.println(new String(buf,0,len));
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //代码来自他人博客
    }

 

字符流和字节流用法一致,区别在于byte数组和char数组

 

管道适合用于线程一对一通信的常景,如果想要一对多,那么就考虑使用共享内存等方法

 

 

以上是关于Java 管道PipedInputStream PipedOutStream PipedReader PipedWriter的主要内容,如果未能解决你的问题,请参考以下文章

Java 管道PipedInputStream PipedOutStream PipedReader PipedWriter

java IO 管道流PipedOutputStream/PipedInputStream

java.io.PipedInputStream

JAVA IO流相关代码(Serializable接口,管道流PipedInputStream类,RandomAccessFile类相关代码)

JAVA IO流相关代码(Serializable接口,管道流PipedInputStream类,RandomAccessFile类相关代码)

PipedInputStream - 如何避免“java.io.IOException:Pipe broken”