zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
  • 相关阅读:
    Docker: Error response from daemon: Cannot restart container xxx: driver failed programming external
    读书笔记 -- 《资本的秩序》
    读书笔记 -- 《高维智慧》
    读书笔记 -- 《内在进化》
    关于JS下offsetLeft,style.left,以及jquery中的offset().left,css("left")的区别。
    MYSQL连接字符串参数解析(解释)
    MySQL 报错:Parameter ‘@XXX‘ must be defined.
    将bat文件或exe程序注册成windows服务
    把批处理(bat)做成Windows服务(Server)
    Mysql5.7.18.1修改用户密码报错ERROR 1054 (42S22): Unknown Column 'Password' In 'Field List'解决办法
  • 原文地址:https://www.cnblogs.com/lingq/p/12929860.html
Copyright © 2011-2022 走看看