Java IO(十三)PipedReader 和 PipedWriter

Java IO(十三)PipedReader 和 PipedWriter

一、介绍

PipedReader 和 PipedWriter 分别是管道字符输入流和管道字符输出流,它们同 PipedInputStream 和 PipedOutputStream 一样,用于管道通讯,相关功能都是类似的。它们的作用是可以通过管道进行线程间的通讯。在使用管道通信时,必须将 PipedWriter 和 PipedReader 配套使用。

  • PipedReader :管道字符输入流,继承于Reader。
  • PipedWriter:管道字符输出流,继承于Writer。

二、构造方法

(一)、PipedReader 

(二)、PipedWriter

三、常用API

(一)、PipedReader 

(二)、PipedWriter

四、实例

多线程通过 PipedWriter 和 PipedReader 进行线程间同通讯,下面例子分别定义三个类:PipedDemo(主线程main类),PipedSender(发送者对象,PipedWriter)、PipedReceiver(接收者对象,PipedReader)。实例中只贴出主要代码。同 PipedInputStream 和 PipedOutputStream 实例类似。

注意点:

管道输入流 PipedInputStream 与管道输出流 PipedOutputStream 建立连接

建立连接一般使用 connect() 方法连接或在创建输入流对象时,传递连接该管道的输出流对象。

connect() ,如:out.connect(in) 和 in.connect(out) 是等价的,开发时只能选择其中的一个而不能两个 connect 同时调用,否则会抛出 java.io.IOException: Already connected 异常。

创建流对象,如:PipedWriter out = new PipedWriter (in),in 为 PipedReader 对象,必须先实例化使用,否则会报 java.lang.NullPointerException 异常。PipedWriter out = new PipedWriter (in) 与 PipedReader in = new PipedReader (out) 是等价的,开发时传递的流对象作为参数必须实例化,然后进行传递。

(一)、PipedSender(发送者对象,PipedWriter)

public class PipedSender implements Runnable{
    private static char[] chs = new char[] 
            {'a','b','c','d','e','f','g','h','i','j','k','l','m',
            'n','o','p','q','r','s','t','u','v','w','x','y','z'};
    PipedWriter wr = new PipedWriter();
    public PipedWriter getPipedWriter() {
        return wr;
    }
    public void run() {
        sendOne(); // 写入较短数据
        sendMove();// 写入较长数据
    }
    /**
     * 写入较短数据
     */
    private void sendOne() {
        try {
            wr.write("this is a PipedSender");
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (wr != null)
                    wr.close();
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 写入较长数据
     */
    private void sendMove() {
        try {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < 100; i++) {
                sb.append("0123456789");
            }
            sb.append(new String(chs));
            String str = sb.toString();
            wr.write(chs);
            wr.write(str);
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (wr != null)
                    wr.close();
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

(二)、PipedReceiver(接收者对象,PipedReader)

public class PipedReceiver implements Runnable {

    PipedReader re = new PipedReader();
    public PipedReader getPipedReader() {
        return re;
    }
    @Override
    public void run() {
        readOne();  // 读取一次
        readMove(); // 全部读取
    }
    /**
     * 读取一次数据
     */
    private void readOne()  {
        char[] buff = new char[2048];
        int len = 0;
        try {
            len = re.read(buff);
            System.out.println("readOne : " + new String(buff,0,len));
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (re != null)
                    re.close();
            }catch(Exception e) {
                e.printStackTrace();
            }    
        }
    }
    /**
     * 全部读取
     */
    private void readMove() {
        char[] buff = new char[1024];
        int len = 0;
        try {
            while(true) {
                len = re.read(buff);
                if(len == -1) break;
                System.out.println("readMove : " + new String(buff,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (re != null)
                    re.close();
            }catch(Exception e) {
                e.printStackTrace();
            }    
        }
    }
}

(三)、PipedDemo(主线程main类)

public class PipedDemo {
    public static void main(String[] args) {
        PipedSender se = new PipedSender();
        PipedReceiver re = new PipedReceiver();
        
        PipedWriter out = se.getPipedWriter();
        PipedReader in = re.getPipedReader();
        try {
            in.connect(out);// 将输入流与输出流建立连接
            // 开启线程
            new Thread(se).start();
            new Thread(re).start();
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
原文地址:https://www.cnblogs.com/lingq/p/12929860.html