PipedInputStream 类是 java.io 包中的一个输入流类,它主要用于实现线程间的管道通信。PipedInputStream 通常与 PipedOutputStream 配合使用,PipedOutputStream 负责向管道中写入数据,而 PipedInputStream 则从管道中读取数据。
PipedInputStream 类可将管道中的内容作为字节流读取。通常,一个线程从 PipedInputStream 对象读取数据,而其他某个线程将数据写入相应的 PipedOutputStream。
不建议在单个线程中同时使用这两个对象(PipedInputStream 和 PipedOutputStream),因为这可能会导致线程死锁(因为 read() 和 write() 方法会阻塞)。管道输入流包含一个缓冲区,在一定范围内将读取操作与写入操作解耦。
📢 注意:管道是同一个 JVM 内,线程之间的通信通道。如果向连接的管道输出流提供数据字节的线程不再处于活动状态,则称管道为损坏。
下面是一个简单的 PipedInputStream 示例:
package com.hxstrive.java_io.pipe;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
* 管道流示例
* @author hxstrive
*/
public class PipeDemo1 {
public static void main(String[] args) throws IOException {
// 创建管道流对象
final PipedOutputStream output = new PipedOutputStream();
final PipedInputStream input = new PipedInputStream(output);
// 线程1,向管道中写入数据
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
try {
// 向管道写入一个字节数组
output.write("Hello world, pipe!".getBytes());
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
// 线程2,从管道中读取数据
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
try {
// 读取数据,一次读一个字节
int data = input.read();
while(data != -1){
System.out.print((char) data);
data = input.read();
}
// 输出:Hello world, pipe!
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
// 启动线程
thread1.start();
thread2.start();
}
}📢 注意:PipedInputStream 的 read() 方法返回一个 int,其中包含所读取字节的字节值。如果 read() 方法返回 -1,则表示流中已无数据可读,可以关闭。也就是说,-1 返回的是 int 值,而不是 -1 返回的字节值。
由于 PipedInputStream 是 InputStream 的子类,因此 PipedInputStream 具有与 InputStream 相同的基本方法和使用模式。
PipedInputStream() 创建一个未连接的 PipedInputStream。
PipedInputStream(int pipeSize) 创建一个未连接的 PipedInputStream,并指定管道缓冲区的大小。
PipedInputStream(PipedOutputStream src) 创建一个 PipedInputStream,并将其连接到指定的 PipedOutputStream。
PipedInputStream(PipedOutputStream src, int pipeSize) 创建一个 PipedInputStream,将其连接到指定的 PipedOutputStream,并指定管道缓冲区的大小。
int read() 从管道中读取一个字节的数据,如果没有可用数据则阻塞线程。
int read(byte[] b, int off, int len) 从管道中读取最多 len 个字节的数据到字节数组 b 中,从偏移量 off 开始存储。
void close() 关闭此输入流并释放与该流关联的所有系统资源。
void connect(PipedOutputStream src) 将此 PipedInputStream 连接到指定的 PipedOutputStream。