重温java知识(三十八、I/O编程之六:管道流)

java可以通过多个线程提高程序的执行性能,所以在进行I/O设计时也提供了不同线程间的管道流通信流。
管道流的主要作用是可以进行两个线程间的通信,分为管道输出流(PIpedOutputStream、PipedWriter)、管道输入流(PipedInputStream、PipedReader)。如果要想进行管道输出,则必须把输出流连在输入流之上。在管道输出流类上定义有以下两个连接方法:

  • 【PipedOutputStream】管道连接:public void connect(PipedInputStream snk){}
  • 【PipedWriter】管道连接:public void connect(PipedInputStream snk){}

1、使用字节管道流实现线程通信的例子:

package com.mydemo;

import java.io.*;

public class FileIODemo {
    public static void main(String[] args) throws Exception {

        // 实例化发送线程
        SendThread sendThread = new SendThread();

        // 实例化接收线程
        ReceiveThread receiveThread = new ReceiveThread();

        // 管道连接
        sendThread.getPipedOutputStream().connect(receiveThread.getPipedInputStream());

        // 启动线程
        new Thread(sendThread, "消息发送线程").start();
        new Thread(receiveThread, "消息接收线程").start();
    }
}

// 管道发送线程
class SendThread implements Runnable {
    // 管道输出流
    private PipedOutputStream pipedOutputStream;

    /**
     * 无参构造
     */
    public SendThread() {
        // 实例化管道输出流
        this.pipedOutputStream = new PipedOutputStream();
    }

    @Override
    public void run() {
        try {
            // 数据发送
            this.pipedOutputStream.write("这是“管道发送线程”发送的信息\n".getBytes());
            // 关闭输出流
            this.pipedOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public PipedOutputStream getPipedOutputStream() {
        return pipedOutputStream;
    }

    public void setPipedOutputStream(PipedOutputStream pipedOutputStream) {
        this.pipedOutputStream = pipedOutputStream;
    }
}

// 数据接收线程
class ReceiveThread implements Runnable {

    // 管道输入流【读取流】
    private PipedInputStream pipedInputStream;

    /**
     * 无参构造方法
     */
    public ReceiveThread() {
        this.pipedInputStream = new PipedInputStream();
    }

    @Override
    public void run() {
        // 开启读取缓冲区
        byte data[] = new byte[1024];

        // 读取长度
        int len = 0;

        // 通过内存流保存内容
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        try {
            // 部分数据读取
            while ((len = this.pipedInputStream.read(data)) != -1) {
                // 数据保存到内存流
                byteArrayOutputStream.write(data, 0, len);
            }

            // 输出数据
            System.out.println(new String(byteArrayOutputStream.toByteArray()));

            // 关闭内存流
            byteArrayOutputStream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            // 关闭输入流
            this.pipedInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public PipedInputStream getPipedInputStream() {
        return pipedInputStream;
    }

    public void setPipedInputStream(PipedInputStream pipedInputStream) {
        this.pipedInputStream = pipedInputStream;
    }
}

运行结果:
这是“管道发送线程”发送的信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值