Java之路:管道流

Java中的管道流模仿了UNIX/Linux的管道概念,用于线程间通信。PipedInputStream和PipedOutputStream构成管道,一个线程写入数据,另一个线程读取。当内部缓冲区满时,写入操作会被阻塞,直到数据被读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在UNIX/Linux中有一个很有用的概念——管道(pipe),它具有将一个程序的输出当作另一个程序的输入的能力

在Java中,它的 I/O系统建立在数据流概念之上,也可以使用“管道”流进行线程之间的通信,在这个机制中,输入流和输出流必须相连接,这样的通信有别于一般的共享数据(Shared Data)缓冲区通信,其不需要一个共享的数据空间

管道流主要用于连接两个线程间的通信。管道流也分为字节流(PipedInputStream、PipedOutputStream)与字符流(PipedReader、PipedWriter)两种类型.

一个PipedInputStream对象必须和一个PipedOutputStream对象进行连接而产生一个通信管道, PipedOutputStream可以向管道中写入数据,PipedInputStream可以从管道中读取PipedOutputStream写入的数据。

如下图所示,这两个类主要用来完成线程之间的通信,一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据:
在这里插入图片描述

package com.xy.io;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class PipeStreamDemo {
	public static void main(String[] args) {
		try {
			Sender sender = new Sender();	// 创建线程对象Sender
			Receiver receiver = new Receiver();	// 创建线程对象Receiver
			PipedOutputStream out = sender.getOutputStream();	// 写入
			PipedInputStream in = receiver.getInputStream();	// 读出
			out.connect(in); // 将输出发送到输入
			sender.start();// 启动线程
			receiver.start();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

class Sender extends Thread {
	private PipedOutputStream out = new PipedOutputStream();
	public PipedOutputStream getOutputStream() {
		return out;
	}
	public void run() {
		String s = new String("Receiver,你好!");
		try {
			out.write(s.getBytes());
			out.close();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

class Receiver extends Thread {
	private PipedInputStream in = new PipedInputStream();
	public PipedInputStream getInputStream() {
		return in;
	}
	public void run() {
		String s = null;
		byte[] b = new byte[1024];
		try {
			int len = in.read(b);
			s = new String(b, 0, len);
			System.out.println("收到了以下信息:" + s);
			in.close();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

【结果】
在这里插入图片描述

此外,注意到第48行,声明的字节数组大小为1024,其实这是有讲究的:

类PipedInputStream运用的是一个1024字节固定大小的循环缓冲区。 实际上,写入PipedOutputStream的数据保存到对应的 PipedInputStream的内部缓冲区。如果对应的 PipedInputStream输入缓冲区已满,再次企图写入PipedOutputStream的线程都将被阻塞,直至出现读取PipedInputStream的操作从缓冲区删除数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值