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

news2024/11/15 23:39:52

博主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,我们可以实现线程之间的简单消息传递。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web APIs知识点讲解(阶段二)

DOM-事件基础 一.事件 1.事件 目标&#xff1a;能够给 DOM元素添加事件监听 事件:事件是在编程时系统内发生的动作或者发生的事情&#xff0c;比如用户在网页上单击一个按钮 事件监听:就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函…

【BBuf的CUDA笔记】十四,OpenAI Triton入门笔记三 FusedAttention

0x0. 前言 继续Triton的学习&#xff0c;这次来到 https://triton-lang.org/main/getting-started/tutorials/06-fused-attention.html 教程。也就是如何使用Triton来实现FlashAttention V2。对于FlashAttention和FlashAttention V2网上已经有非常多的介绍了&#xff0c;大家如…

华为配置WLAN高密业务示例

配置WLAN高密业务示例 组网图形 图1 配置高密WLAN环境网络部署组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 体育场由于需要接入用户数量很大&#xff0c;AP间部署距离较小&#xff0c;因此AP间的干扰较大&#xff0c;可能导致用户上网网…

ShardingJdbc实战-ShardingJdbc配置及读写分离

文章目录 一、项目搭建二、测试结果1.访问http://localhost:8085/user/save2.访问http://localhost:8085/user/listuser 一、项目搭建 新建一个Spring Boot工程 引入依赖-sharding、ssm、数据库驱动 <properties><java.version>1.8</java.version><shardi…

linux系统Jenkins工具的node节点配置

Jenkins工具添加节点 node 节点的作用node节点配置 node 节点的作用 分布式构建&#xff1a;通过添加多个节点&#xff0c;可以在多台计算机上并行执行构建任务&#xff0c;从而加快构建速度和提高效率。节点可以是物理计算机、虚拟机、云实例或容器等。扩展计算能力&#xff…

仓储自动化新解:托盘四向穿梭车驶入智能工厂 智能仓储与产线紧密结合

目前&#xff0c;由于对仓库存储量的要求越来越高&#xff0c;拣选、输送以及出入库频率等要求也越来越高&#xff0c;对此&#xff0c;在物流仓储领域&#xff0c;自动化与智能化控制技术得以快速发展&#xff0c;货架穿梭车在自动库领域的应用越来越广泛。现阶段&#xff0c;…

皇冠测评:网络电视盒子哪个品牌好?电视盒子排行榜

欢迎各位来到我们的测评频道&#xff0c;本期我们要分享的产品是电视盒子&#xff0c;因很多网友留言不知道网络电视盒子哪个品牌好&#xff0c;我们通过为期一个月的测评后整理了电视盒子排行榜&#xff0c;想买电视盒子的可以看看下面这五款产品&#xff0c;它们各方面表现非…

MySQL安装部署-NDB版

NDB&#xff08;Network Database&#xff09;是网络数据库&#xff0c;其架构是由MySQL Server集群以及NDB存储引擎集群组成&#xff0c;是存算分离架构&#xff0c;MySQL Server主要是负责计算、NDB存储引擎主要负责数据存储&#xff0c;其特点是支持高可用、支持无单点故障、…

SOCKS55代理与Http代理有何区别?如何选择?

在使用IPFoxy全球代理时&#xff0c;选择 SOCKS55代理还是HTTP代理&#xff1f;IPFoxy代理可以SOCKS55、Http协议自主切换&#xff0c;但要怎么选择&#xff1f;为解决这个问题&#xff0c;得充分了解两种代理的工作原理和配置情况。 在这篇文章中&#xff0c;我们会简要介绍 …

输入一个字符串,将其中的数字字符移动到非数字字符之后

输入一个字符串&#xff0c;将其中的数字字符移动到非数字字符之后&#xff0c;并保持数字字符贺非数字字符输入时的顺序。 代码&#xff1a; #include <cstdio> #include <queue> using namespace std; int main() {char str[200];fgets(str, 200, stdin);//读入…

10分钟SkyWalking与SpringBoot融合并整合到Linux中

1.依赖配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.0.RELEASE</version></dependency><dependency><groupId>org.springframe…

经销商文件分发 怎样兼顾安全和效率?

经销商文件分发是指将文件、资料、产品信息等从制造商或经销商传递给经销商的过程。这一过程对于确保经销商能够获取最新的产品信息、销售策略、市场活动资料等至关重要。 想要管理众多经销商合作伙伴之间的文件传输并提高效率&#xff0c;可以采取以下措施&#xff1a; 1、建…

2024 2.24~3.1 周报

目录 一、本周计划 二、DD-Net整体介绍 三、DDNet的体系结构 四、损失函数 五、课程学习 六、实验环境 A. SEG盐数据集 B. OpenFWI数据集 C. 训练和前沿设置&#xff08;未完&#xff09; 七、结论 八、跑代码——对比试验结果&#xff08;CBAM&#xff09; 1. In…

Redis 之五:Redis 的主从复制

概念 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务器都是主节…

Spark Shuffle Tracking 原理分析

Shuffle Tracking Shuffle Tracking 是 Spark 在没有 ESS(External Shuffle Service)情况&#xff0c;并且开启 Dynamic Allocation 的重要功能。如在 K8S 上运行 spark 没有 ESS。本文档所有的前提都是基于以上条件的。 如果开启了 ESS&#xff0c;那么 Executor 计算完后&a…

C#用户界面,UI设置密码隐藏显示

两种方法&#xff0c;第一种&#xff0c;在文本框属性设置UseSystemPasswordChar为True。 这里默认是以黑点隐藏显示。 第二种&#xff0c;在文本框属性设置隐藏显示的符号&#xff0c;这里设置为星号*。

探索Android多屏互动技术:构建无缝交互体验

探索Android多屏互动技术&#xff1a;构建无缝交互体验 1. 简介 在当前移动设备和智能家居应用中&#xff0c;多屏互动技术已经成为一个备受关注的话题。随着移动设备&#xff08;如智能手机、平板电脑&#xff09;和智能家居设备的普及&#xff0c;用户对于多屏协同工作、娱…

基于springboot实现流浪动物救助网站系统项目【项目源码+论文说明】

基于springboot实现流浪动物救助网站系统演示 摘要 然而随着生活的加快&#xff0c;也使很多潜在的危险日益突显出来&#xff0c;比如在各种地方会发现很多无家可归的、伤痕累累的、可怜兮兮的动物&#xff0c;当碰到这种情况&#xff0c;是否会立马伸出双手去帮助、救助它们&…

重磅功能!EasyBoss ERP正式接入Lazada本土店全托管,赋能商家轻松出海东南亚

近两年&#xff0c;在跨境电商圈出现了一个新的名词——“全托管模式”&#xff0c;随着部分跨境电商巨头借助全托管模式大获成功&#xff0c;全托管在跨境电商领域掀起一股热潮&#xff0c;吸引着越来越多的平台与卖家布局探索。 作为东南亚头部电商平台的Lazada也在2023年4月…

uniapp 安卓保活功能原生插件

插件介绍 安卓保活原生插件&#xff0c;多种技术保活方案大幅提高保活效率&#xff0c;支持多任务app隐藏&#xff0c;息屏保活&#xff0c;清理后继续保活等 插件地址 安卓保活功能原生插件 - DCloud 插件市场 详细使用文档 uniapp 安卓保活功能原生插件 超级福利 uniapp…