PipedInputStream 类

PipedInputStream 类是 java.io 包中的一个输入流类,它主要用于实现线程间的管道通信。PipedInputStream 通常与 PipedOutputStream 配合使用,PipedOutputStream 负责向管道中写入数据,而 PipedInputStream 则从管道中读取数据。

PipedInputStream 类可将管道中的内容作为字节流读取。通常,一个线程从 PipedInputStream 对象读取数据,而其他某个线程将数据写入相应的 PipedOutputStream。

不建议在单个线程中同时使用这两个对象(PipedInputStream 和 PipedOutputStream),因为这可能会导致线程死锁(因为 read() 和 write() 方法会阻塞)。管道输入流包含一个缓冲区,在一定范围内将读取操作与写入操作解耦。

📢 注意:管道是同一个 JVM 内,线程之间的通信通道。如果向连接的管道输出流提供数据字节的线程不再处于活动状态,则称管道为损坏。

PipedInputStream 示例

下面是一个简单的 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 方法

由于 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。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号