(每日持续更新)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,我们可以实现线程之间的简单消息传递。

相关推荐
Evand J1 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB1 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3051 小时前
11.vector的介绍及模拟实现
开发语言·c++
计算机学长大白2 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
suweijie7682 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿3 小时前
List深拷贝后,数据还是被串改
java
PieroPc3 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439695 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna6 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
xlsw_6 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis