(每日持续更新)jdk api之PipedInputStream基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

关注【架构师成长之道】 输入"java基础课程",即可免费获得全套架构师全套课程

一、java.io

1.57 PipedInputStream

PipedInputStream 类是 Java I/O 包中的一个类,它表示从管道中读取数据的输入流。管道输入流必须与管道输出流一起使用,以便将数据从一个线程传输到另一个线程。以下是关于 PipedInputStream 的详细介绍:

PipedInputStream 类介绍:
构造方法:
  • PipedInputStream(): 创建一个未连接的管道输入流。

  • PipedInputStream(PipedOutputStream src): 创建一个连接到指定管道输出流的管道输入流。

方法摘要:
  • void connect(PipedOutputStream src) throws IOException: 将管道输入流连接到指定的管道输出流。

  • int read() throws IOException: 从管道中读取下一个字节的数据。

  • int read(byte[] b, int off, int len) throws IOException: 从管道中读取数据到指定的字节数组中。

简单使用例子:

以下是一个简单的例子,演示了如何使用 PipedInputStreamPipedOutputStream 来实现线程间的通信:

复制代码
javaCopy code
import java.io.*;
​
public class PipeExample {
​
    public static void main(String[] args) {
        try {
            // 创建管道输入流和管道输出流
            PipedInputStream pipedInputStream = new PipedInputStream();
            PipedOutputStream pipedOutputStream = new PipedOutputStream();
​
            // 将管道输入流连接到管道输出流
            pipedInputStream.connect(pipedOutputStream);
​
            // 创建并启动写入线程
            Thread writerThread = new Thread(() -> {
                try {
                    String message = "Hello, Pipe!";
                    pipedOutputStream.write(message.getBytes());
                    pipedOutputStream.close(); // 发送完毕后关闭输出流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            writerThread.start();
​
            // 读取管道中的数据
            int data;
            while ((data = pipedInputStream.read()) != -1) {
                System.out.print((char) data);
            }
​
            // 关闭输入流
            pipedInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们创建了一个管道输入流和一个管道输出流,并将它们连接起来。然后,我们创建了一个写入线程,它向管道输出流中写入数据。主线程通过管道输入流读取数据,并将其打印到控制台上。

应用场景

PipedInputStream 主要用于实现线程之间的通信,通常与 PipedOutputStream 一起使用。以下是一些常见的应用场景及相应的代码实现:

  1. 线程间通信PipedInputStreamPipedOutputStream 可以用于在不同线程之间传输数据,例如在生产者-消费者模式中。
复制代码
javaCopy code
public class PipeExample {
    public static void main(String[] args) {
        try {
            PipedInputStream pipedInputStream = new PipedInputStream();
            PipedOutputStream pipedOutputStream = new PipedOutputStream();
            pipedInputStream.connect(pipedOutputStream);
​
            Thread producerThread = new Thread(() -> {
                try {
                    for (int i = 1; i <= 5; i++) {
                        pipedOutputStream.write(i);
                        Thread.sleep(1000);
                    }
                    pipedOutputStream.close();
                } catch (IOException | InterruptedException e) {
                    e.printStackTrace();
                }
            });
​
            Thread consumerThread = new Thread(() -> {
                try {
                    int data;
                    while ((data = pipedInputStream.read()) != -1) {
                        System.out.println("Received: " + data);
                    }
                    pipedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
​
            producerThread.start();
            consumerThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.数据处理管道:可以使用管道流来创建数据处理管道,其中一个线程读取数据,另一个线程对数据进行处理。

复制代码
javaCopy code
public class DataProcessingPipeline {
    public static void main(String[] args) {
        try {
            PipedInputStream pipedInputStream = new PipedInputStream();
            PipedOutputStream pipedOutputStream = new PipedOutputStream();
            pipedInputStream.connect(pipedOutputStream);
​
            Thread dataProducerThread = new Thread(() -> {
                try {
                    String data = "Data to be processed";
                    pipedOutputStream.write(data.getBytes());
                    pipedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
​
            Thread dataProcessorThread = new Thread(() -> {
                try {
                    StringBuilder stringBuilder = new StringBuilder();
                    int data;
                    while ((data = pipedInputStream.read()) != -1) {
                        stringBuilder.append((char) data);
                    }
                    System.out.println("Processed Data: " + stringBuilder.toString());
                    pipedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
​
            dataProducerThread.start();
            dataProcessorThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上是两个使用 PipedInputStream 的应用场景及相应的代码实现。这些例子展示了如何使用 PipedInputStream 来实现线程之间的数据传输。

实战例子

下面是一个简单的项目实战例子,演示了如何使用 PipedInputStreamPipedOutputStream 实现一个简单的消息传递系统。在这个例子中,有一个生产者线程负责生成消息,将消息通过管道输出流发送给消费者线程,消费者线程从管道输入流接收消息并处理。

复制代码
javaCopy code
import java.io.*;
​
public class MessagingSystem {
​
    public static void main(String[] args) {
        try {
            // 创建管道输入流和管道输出流
            PipedInputStream pipedInputStream = new PipedInputStream();
            PipedOutputStream pipedOutputStream = new PipedOutputStream();
​
            // 将管道输入流连接到管道输出流
            pipedInputStream.connect(pipedOutputStream);
​
            // 创建并启动生产者线程
            Thread producerThread = new Thread(() -> {
                try {
                    // 生产消息
                    String message = "Hello from Producer!";
                    // 发送消息到管道输出流
                    pipedOutputStream.write(message.getBytes());
                    pipedOutputStream.close(); // 发送完毕后关闭输出流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            producerThread.start();
​
            // 创建并启动消费者线程
            Thread consumerThread = new Thread(() -> {
                try {
                    // 读取管道中的数据
                    int data;
                    StringBuilder receivedMessage = new StringBuilder();
                    while ((data = pipedInputStream.read()) != -1) {
                        receivedMessage.append((char) data);
                    }
                    // 处理接收到的消息
                    System.out.println("Received message: " + receivedMessage.toString());
                    // 关闭输入流
                    pipedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            consumerThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,生产者线程生成一条消息并将其发送到管道输出流。消费者线程从管道输入流读取消息并进行处理。通过使用 PipedInputStreamPipedOutputStream,我们可以实现线程之间的简单消息传递。

相关推荐
草莓base1 分钟前
【手写一个spring】spring源码的简单实现--容器启动
java·后端·spring
mqiqe9 分钟前
Elasticsearch 分词器
python·elasticsearch
Allen Bright14 分钟前
maven概述
java·maven
qystca17 分钟前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
编程重生之路17 分钟前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
薯条不要番茄酱17 分钟前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子22 分钟前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab
努力进修26 分钟前
“探索Java List的无限可能:从基础到高级应用“
java·开发语言·list
politeboy26 分钟前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
Daniel 大东1 小时前
BugJson因为json格式问题OOM怎么办
java·安全