• java PipedReader类、PipedWriter类


    1、PipedWriter类

    类型概述

    PipedWriter类用于将Java管道作为字符流编写。此类通常用于编写文本。通常,PipedWriter连接到PipedReader,并由不同的线程使用。

    构造方法

    PipedWriter()	
    
    • 1

    创建尚未连接到PipedReader的PipedWriter。

    PipedWriter(PipedReader snk)	
    
    • 1

    创建一个连接到指定PipedReader的PipedWriter。

    对象方法

    1、close函数

    void close()	
    
    • 1

    关闭此PipedWriter并释放与此流关联的所有系统资源。

    2、connect函数

    void connect(PipedReader snk)	
    
    • 1

    将这个PipedWriter连接到接收器。

    3、flush函数

    void flush()	
    
    • 1

    刷新此输出流,并强制写出所有缓冲的输出字符。

    4、write函数

    void write(char[] cbuf, int off, int len)	
    
    • 1

    将从指定的字符数组开始的len个字符从偏移量开始写入此PipedWriter。

    void write(int c)
    
    • 1

    将指定的char写入PipedWriter。

    2、PipedWriter类

    类型概述

    PipedReader类用于以字符流的形式读取管道的内容。这个类一般是用来阅读的文本。PipedReader类必须连接到相同的PipedWriter,并且由不同的线程使用。

    构造方法

    PipedReader(int pipeSize)	
    
    • 1

    创建一个PipedReader,以便尚未连接,并使用指定的管道大小作为管道的缓冲区。

    PipedReader(PipedWriter src)	
    
    • 1

    创建一个PipedReader,以便将其连接到管道写入器src。

    PipedReader(PipedWriter src, int pipeSize)	
    
    • 1

    创建一个PipedReader,以便将其连接到管道编写器src,并将指定的管道大小用于管道的缓冲区。

    PipedReader()	
    
    • 1

    创建一个PipedReader,以便尚未连接。

    对象方法

    1、close函数

    void close()	
    
    • 1

    关闭此PipedReader并释放与该流关联的所有系统资源。

    2、connect函数

    void connect(PipedWriter src)	
    
    • 1

    将使此管道读取器连接到PipedWriter。

    3、read函数

    int read()	
    
    • 1

    从此PipedReader中读取数据的下一个字符。

    int read(char[] cbuf, int off, int len)	
    
    • 1

    从此PipedReader中读取最多len个数据字符到一个字符数组中。

    使用示例

    多线程中通过PipedWriter和PipedReader通信的例子。

    import java.io.IOException;
    
    import java.io.PipedReader;
    
    @SuppressWarnings("all")
    /**
     * 接收者线程
     */
    public class Receiver extends Thread {
    
        // 管道输入流对象。
        // 它和“管道输出流(PipedWriter)”对象绑定,
        // 从而可以接收“管道输出流”的数据,再让用户读取。
        private PipedReader in = new PipedReader();
    
        // 获得“管道输入流对象”
        public PipedReader getReader(){
            return in;
        }
    
        @Override
        public void run(){
            readMessageOnce() ;
            //readMessageContinued() ;
        }
    
        // 从“管道输入流”中读取1次数据
        public void readMessageOnce(){
            // 虽然buf的大小是2048个字符,但最多只会从“管道输入流”中读取1024个字符。
            // 因为,“管道输入流”的缓冲区大小默认只有1024个字符。
            char[] buf = new char[2048];
            try {
                int len = in.read(buf);
                System.out.println(new String(buf,0,len));
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        // 从“管道输入流”读取>1024个字符时,就停止读取
        public void readMessageContinued(){
            int total=0;
            while(true) {
                char[] buf = new char[1024];
                try {
                    int len = in.read(buf);
                    total += len;
                    System.out.println(new String(buf,0,len));
                    // 若读取的字符总数>1024,则退出循环。
                    if (total > 1024)
                        break;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    import java.io.IOException;
    
    import java.io.PipedWriter;
    @SuppressWarnings("all")
    /**
     * 发送者线程
     */
    public class Sender extends Thread {
    
        // 管道输出流对象。
        // 它和“管道输入流(PipedReader)”对象绑定,
        // 从而可以将数据发送给“管道输入流”的数据,然后用户可以从“管道输入流”读取数据。
        private PipedWriter out = new PipedWriter();
    
        // 获得“管道输出流”对象
        public PipedWriter getWriter(){
            return out;
        }
    
        @Override
        public void run(){
            writeShortMessage();
            //writeLongMessage();
        }
    
        // 向“管道输出流”中写入一则较简短的消息:"this is a short message"
        private void writeShortMessage() {
            String strInfo = "this is a short message" ;
            try {
                out.write(strInfo.toCharArray());
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 向“管道输出流”中写入一则较长的消息
        private void writeLongMessage() {
            StringBuilder sb = new StringBuilder();
            // 通过for循环写入1020个字符
            for (int i=0; i<102; i++)
                sb.append("0123456789");
            // 再写入26个字符。
            sb.append("abcdefghijklmnopqrstuvwxyz");
            // str的总长度是1020+26=1046个字符
            String str = sb.toString();
            try {
                // 将1046个字符写入到“管道输出流”中
                out.write(str);
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    import java.io.PipedReader;
    import java.io.PipedWriter;
    import java.io.IOException;
    
    @SuppressWarnings("all")
    /**
     * 管道输入流和管道输出流的交互程序
     */
    public class PipeTest {
    
        public static void main(String[] args) {
            Sender t1 = new Sender();
    
            Receiver t2 = new Receiver();
    
            PipedWriter out = t1.getWriter();
    
            PipedReader in = t2.getReader();
    
            try {
                //管道连接。下面2句话的本质是一样。
                //out.connect(in);
                in.connect(out);
    
                /**
                 * Thread类的START方法:
                 * 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
                 * 结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。
                 * 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
                 */
                t1.start();
                t2.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    docker + miniconda + python 环境安装与迁移(详细版)
    JetBrain Pycharm的一系列快捷键
    如何发布一个 npm 包
    2022.8.9考试独特的投标拍卖--800题解
    C++ 代码输出春天的春
    Kyligence Copilot 亮相第六届进博会,增添数智新活力
    C 语言中关键字const
    EditorConfig + Prettier + ESLint 代码规范化
    Shifu+WasmEdge:物联网数据轻松“瘦身”
    【操作系统】2.1 进程与线程总结
  • 原文地址:https://blog.csdn.net/weixin_49346755/article/details/125894744