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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/419561.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

双通道 40V 160mΩ车规级高侧电源开关带诊断功能反向电池保护功能

概述 PC8916是双通道、高功率具有集成NMOS功率FET的开关&#xff0c;以及电荷泵。该设备集成了高级 保护功能&#xff0c;例如负载电流限制&#xff0c;通过功率限制进行过载主动管理带可配置闭锁的超温停机。全面诊断和高精度电流感应这些功能实现了对负载的智能控制。有源漏…

零售经营“新赛道” ——基于手机银行APP专区调研的客群精细化运营分析报告

随着银行业竞争的不断深入及新客户增量日渐“到顶”&#xff0c;各家银行的客群竞争逐渐由“跑马圈地”进入“精耕细作”的新阶段&#xff0c;在客群精准化服务方面不断深入。目前&#xff0c;国内主要商业银行均已在手机银行上建立了相应的用户专区&#xff08;或对应版本APP&…

敏捷开发模型:一种灵活、协作和持续的软件开发方法

敏捷开发模型&#xff1a;一种灵活、协作和持续的软件开发方法 引言 在软件开发领域&#xff0c;随着市场需求的不断变化和技术的迅速发展&#xff0c;传统的瀑布模型逐渐暴露出其局限性。为了应对这些挑战&#xff0c;敏捷开发模型应运而生。敏捷开发模型强调灵活、协作和持…

EasyRecovery2024免费无需付费版电脑数据恢复软件

一、功能概述 EasyRecovery数据恢复软件是一个功能全面的数据恢复工具&#xff0c;其主要功能包括&#xff1a; 文件恢复&#xff1a;能够恢复各种文件类型&#xff0c;如文档、图片、视频、音频等&#xff0c;满足用户多样化的数据恢复需求。分区恢复&#xff1a;当硬盘分区…

Bert-as-service 实战

参考&#xff1a;bert-as-service 详细使用指南写给初学者-CSDN博客 GitHub - ymcui/Chinese-BERT-wwm: Pre-Training with Whole Word Masking for Chinese BERT&#xff08;中文BERT-wwm系列模型&#xff09; 下载&#xff1a;https://storage.googleapis.com/bert_models/…

推荐一个屏幕上鼠标高亮显示的小工具

在视频录制等特定场景下&#xff0c;很多人希望在点击鼠标时能够在屏幕上及时进行显示&#xff0c;便于别人发现&#xff0c;提高别人的注意力。 因此&#xff0c;很多录屏软件中都内含显示鼠标点击功能。那如果不支持该怎么办呢&#xff1f;其实&#xff0c;也是可以通过其他工…

JavaScript-关于事件、事件流(捕获、冒泡)、事件源、常用事件

1.如何注册事件(如何绑定事件) ​ 何为注册事件&#xff0c;就是给元素添加事件&#xff0c;其方式有传统注册事件、方法监听注册事件。 0、1级事件&#xff08;传统注册事件&#xff09;不允许多个响应程序 我们在元素内或js内使用on的方式就是传统注册事件&#xff0c;这种形…

lv20 QT 常用控件 2

1 QT GUI 类继承简介 布局管理器 输出控件 输入控件 按钮 容器 2 按钮示例 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QCheckBox> #include <QLineEdit> #include <QPushButton>class Widget : public QWidget {Q_OBJECTpublic…

第1篇 Linux Docker安装rabbitmq

Docker安装RabbitMq 1、搜索rabbitmq镜像 docker search rabbitmq2、下载rabbitmq镜像 docker pull rabbitmq3、运行rabbitmq服务 docker run -d --name rabbitmq --restart always -p 15672:15672 -p 5672:5672 rabbitmq4、访问rabbitmq http://192.168.1.x:15672 5、rab…

彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进

视觉三维重建 定位定姿 稠密重建 surface reconstruction 纹理贴图。三维重建技术是计算机视觉的重要技术之一&#xff0c;基于视觉的三维重建技术通过深度数据获取、预处理、点云配准与融合、生成物体表面等过程&#xff0c;把真实场景刻画成符合计算机逻辑表达的数学模型。…

数据结构—>带你深入了解单链表(基础篇)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 前面我们学习了顺序表&#xff0c;今天我们来学习与顺序表类似的单链表 1.&#x1f3…

乐吾乐Web可视化RTSP播放

背景 乐吾乐致力于物联网和智能制造等场景的Web可视化平台和解决方案&#xff0c;其中摄像头播放必不可少。 当前国内摄像头都以RTSP协议为主&#xff0c;而HTML不能直接读取RTSP协议&#xff0c;因此需要一个转流服务。乐吾乐Web可视化播放RTSP也是如此&#xff1a; RTSP协…

鸿蒙Harmony应用开发—ArkTS声明式开发(组件快捷键事件)

开发者可以设置组件的自定义组合键&#xff0c;组合键的行为与click行为一致&#xff0c;组件在未获得焦点状态下也可以响应自定义组合键&#xff0c;每个组件可以设置多个组合键。 说明&#xff1a; 从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单…

Facebook的元宇宙实践:数字化社交的新前景

近年来&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念备受瞩目&#xff0c;被认为是数字化社交的未来趋势之一。而在众多科技巨头中&#xff0c;Facebook&#xff08;现更名为Meta&#xff09;一直处于元宇宙发展的前沿。在本文中&#xff0c;我们将深入探讨Fac…

SpringCloud搭建微服务之Consul服务注册与发现

1. Consul介绍 Consul是由HashiCorp公司使用Go语言开发的一款开源工具&#xff0c;主要用于实现分布式系统的服务发现和服务配置&#xff0c;其内置了服务注册与发现框架、分布式一致性协议实现、健康检查、Key-Value存储、多数据中心方案。Consul具有高可移植性&#xff0c;支…

螺旋模型——软件开发过程中的灵活迭代之道

螺旋模型——软件开发过程中的灵活迭代之道 引言&#xff1a; 在软件开发领域&#xff0c;项目管理对于确保项目的成功至关重要。随着软件行业的快速发展&#xff0c;传统的瀑布模型逐渐暴露出其局限性。为了满足不断变化的需求&#xff0c;并提高软件开发的灵活性和适应性&am…

(案例贴2) html+css 倒计时器

欢迎大家使用这个计时器噢 老哥直接附代码咯. timer.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

群控代理IP搭建教程:打造一流的网络爬虫

目录 前言 一、什么是群控代理IP&#xff1f; 二、搭建群控代理IP的步骤 1. 获取代理IP资源 2. 配置代理IP池 3. 选择代理IP策略 4. 编写代理IP设置代码 5. 异常处理 三、总结 前言 群控代理IP是一种常用于网络爬虫的技术&#xff0c;通过使用多个代理IP实现并发请求…

快速下载Huggingface的大语言模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Huggingface是什么&#xff1f;二、基于官方huggingface-cli下载&#xff08;基础&#xff0c;断线风险&#xff09;1.安装hf下载环境2.配置环境变量3.注册…

【Ai生态开发】Spring AI上架,打造专属业务大模型,AI开发再也不是难事!

大家好 这里是苏泽 后端是工作 ai是兴趣 对于ai的产生我的立场是拥抱ai的 是希望拿他作为提升能力的工具 那么这一篇带大家来学习如何使用ai打造一个专属的业务大模型 需求 就是说假设现在有一个 商城系统 里面有查询订单的api和获取商品购买方式的api 用户只需要输入 “…