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。