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

news2024/12/26 22:43:56

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

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

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

 

1.58 PipedOutputStream

PipedOutputStream 是 Java I/O 包中的一个类,用于向管道中写入数据。它通常与 PipedInputStream 一起使用,用于线程之间的通信。以下是关于 PipedOutputStream 的详细介绍:

PipedOutputStream 类介绍:
构造方法:
  • PipedOutputStream(): 创建一个未连接到任何管道的管道输出流。

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

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

  • void write(int b) throws IOException: 将指定的字节写入管道。

  • void write(byte[] b, int off, int len) throws IOException: 将指定字节数组中的一部分写入管道。

简单使用例子:

以下是一个简单的例子,演示了如何使用 PipedOutputStream 向管道中写入数据:

javaCopy code
import java.io.*;
​
public class PipedOutputStreamExample {
​
    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,然后将它们连接起来。写入线程向管道输出流写入数据,而主线程从管道输入流读取数据并将其打印到控制台上。

应用场景

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

  1. 线程间通信PipedOutputStream 可以用于在线程之间传输数据,例如在生产者-消费者模式中。

javaCopy code
import java.io.*;
​
public class ThreadCommunicationExample {
​
    public static void main(String[] args) {
        try {
            PipedInputStream pipedInputStream = new PipedInputStream();
            PipedOutputStream pipedOutputStream = new PipedOutputStream();
            pipedInputStream.connect(pipedOutputStream);
​
            // Producer Thread
            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();
                }
            });
​
            // Consumer Thread
            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.数据处理管道:可以使用管道流来创建数据处理管道,其中一个线程写入数据到 PipedOutputStream,另一个线程从 PipedInputStream 读取数据进行处理。

javaCopy code
import java.io.*;
​
public class DataProcessingPipeline {
​
    public static void main(String[] args) {
        try {
            PipedInputStream pipedInputStream = new PipedInputStream();
            PipedOutputStream pipedOutputStream = new PipedOutputStream();
            pipedInputStream.connect(pipedOutputStream);
​
            // Producer Thread
            Thread producerThread = new Thread(() -> {
                try {
                    String data = "Data to be processed";
                    pipedOutputStream.write(data.getBytes());
                    pipedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
​
            // Consumer Thread
            Thread consumerThread = 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();
                }
            });
​
            producerThread.start();
            consumerThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

实战例子

下面是一个使用 PipedOutputStream 的简单项目实战例子,模拟了一个简单的消息发布和订阅系统:

javaCopy code
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
​
public class MessageSystem {
​
    public static void main(String[] args) {
        try {
            // 创建管道输入流和管道输出流
            PipedInputStream subscriberInputStream = new PipedInputStream();
            PipedOutputStream publisherOutputStream = new PipedOutputStream();
            // 将管道输入流连接到管道输出流
            subscriberInputStream.connect(publisherOutputStream);
​
            // 创建发布者线程
            Thread publisherThread = new Thread(() -> {
                try {
                    // 发布消息
                    String message = "This is a message from the publisher.";
                    publisherOutputStream.write(message.getBytes());
                    publisherOutputStream.close(); // 发布完毕后关闭输出流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
​
            // 创建订阅者线程
            Thread subscriberThread = new Thread(() -> {
                try {
                    // 读取消息
                    int data;
                    StringBuilder receivedMessage = new StringBuilder();
                    while ((data = subscriberInputStream.read()) != -1) {
                        receivedMessage.append((char) data);
                    }
                    // 处理接收到的消息
                    System.out.println("Received message: " + receivedMessage.toString());
                    // 关闭输入流
                    subscriberInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
​
            // 启动发布者和订阅者线程
            publisherThread.start();
            subscriberThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们创建了一个简单的消息发布和订阅系统。发布者线程负责发布消息,它将消息写入 PipedOutputStream。订阅者线程负责订阅消息,它从 PipedInputStream 中读取消息并处理。通过 PipedOutputStreamPipedInputStream 实现了线程之间的消息传递,这样就实现了一个简单的消息发布和订阅系统。

 

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

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

相关文章

7. 构建简单 IPv6 网络

7.1 实验介绍 7.1.1 关于本实验 IPv6&#xff08;Internet Protocol Version 6&#xff09;也被称为IPng&#xff08;IP Next Generation&#xff09;。它是Internet工程任务组IETF&#xff08;Internet Engineering Task Force&#xff09;设计的一套规范&#xff0c;是IPv4…

Android minigbm框架普法

Android minigbm框架普法 引言 假设存在这么一个场景&#xff0c;我的GPU的上层实现走的不是标准的Mesa接口&#xff0c;且GPU也没有提专门配套的gralloc和hwcompoer实现。那么我们的Android要怎么使用到EGL和GLES库呢&#xff0c;并且此GPU驱动是支持drm实现的&#xff0c;也有…

Docker中使用Tomcat并部署war工程

系列文章目录 文章目录 系列文章目录前言一、构建镜像二、运行镜像三、列出正在运行的容器四、停止正在运行的容器 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文…

蓝桥杯Python B组练习——python复习2

蓝桥杯Python B组练习——python复习2 一、简介 复习python&#xff0c;参考书《Python编程从入门到实践》&#xff0c;[美]Eric Mathes著。前一部分见专栏——蓝桥杯Python B组练习 这一部分不全&#xff0c;不想写了 二、字典 1.一个简单的字典 来看一个游戏&#xff0…

Vue2:用node+express写一个轻量级的后端服务

1、桌面创建demo文件夹 进入demo&#xff0c;执行如下命令 npm init输入名称&#xff1a; test_server然后一路回车 2、安装express框架 npm i express3、新建server.js 在demo文件夹中&#xff0c;新建server.js const express require(express) const app express()…

系统集成Prometheus+Grafana

根据产品需求在自己的系统中添加一个系统监控的页面&#xff0c;其中有主机信息的显示&#xff0c;也有一些业务信息的显示。调研后的方案是 主机信息通过Prometheus采集和存储&#xff0c;业务信息通过自己系统的调度任务统计后存储在Mysql中&#xff0c;使用Grafana对接Prome…

LeetCode383. 赎金信(C++)

LeetCode383. 赎金信 题目链接代码 题目链接 https://leetcode.cn/problems/ransom-note/description/ 代码 class Solution { public:bool canConstruct(string ransomNote, string magazine) {int record[26] {0};if(ransomNote.size() > magazine.size()) return fa…

EasyRecovery2024国产免费的手机数据恢复软件

一、功能介绍 EasyRecovery手机数据恢复软件是一款功能全面的数据恢复工具&#xff0c;专为移动设备设计。其主要功能包括&#xff1a; 文件恢复&#xff1a;能够恢复手机中因各种原因丢失的文件&#xff0c;如照片、视频、音频、文档等。深度扫描&#xff1a;通过深度扫描手…

element-plus+vue3表单含图片(可预览)(线上图片)

一、要实现的效果&#xff1a; 二、如果期间出现这样的效果&#xff08;表格穿透过来了&#xff09;&#xff0c;加上了这行代码就可以了&#xff1a; preview-teleported“true” 如果仅测试用&#xff0c;建议使用线上图片链接的形式&#xff0c;免得本地地址不生效&#xf…

Leetcoder Day25| 回溯part05:子集+排列

491.递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入:[4, 7, 6, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [6, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数…

2.模拟问题——1.输出梯形

补充&#xff1a;每行需要加两颗星 这种类型题目难度不大&#xff0c;一般是签到题。 规律总结 第一行是h个*&#xff1b;&#xff08;h2*0&#xff09;第二行是h2个*&#xff1b;(h2*1)…第i行是h2*(i-1)个*第h行是h2*(h-1)个* 注意&#xff0c;第h行表示梯形的底边长度&a…

Highest Price in Supply Chain (25)

1、题目&#xff1a; A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting …

MYSQL--锁机制*

一.对锁机制的大概介绍: 1.大概的来说,MYSQL当中的锁实际上就是合理的管理多个服务器对于同一个共享资源的使用,是计算机协调多个进程或者是线程并发访问某一资源的机制(避免争抢资源的现象发生) 2.在数据库当中,数据是一种可以供许多的用户进行共享使用的资源,如何保证数据并发…

pclpy 点云法线

pclpy 点云法线 一、算法原理1.理论入门2.选择正确的比例 二、代码三、结果四、相关数据 一、算法原理 表面法线是几何表面的重要属性&#xff0c;在许多领域&#xff08;例如计算机图形应用程序&#xff09;中大量使用&#xff0c;以应用正确的光源来生成阴影和其他视觉效果。…

先进电机技术 —— 通用变频器

一、变频器名称定义 通用变频器&#xff08;Variable Frequency Drive, VFD&#xff09;是一种广泛应用于工业控制领域的电力电子设备&#xff0c;其主要功能是改变供电电源的频率和电压&#xff0c;以达到对交流电动机转速进行精确、连续调节的目的。通用变频器通常具备以下特…

2023年12月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析

一、单选题(共15题,共30分) 第1题 现代计算机是指电子计算机,它所基于的是( )体系结构。 A:艾伦图灵 B:冯诺依曼 C:阿塔纳索夫 D:埃克特-莫克利 答案:B 第2题 默认小猫角色,执行下列程序,舞台上会看到? ( ) A: B: C: D: 答案:C

数据库-第二/三章 关系数据库和标准语言SQL【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下计数据库系统概论中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 参考资料是王珊老师和萨师煊老师的数据库系统概论(第五版)。 文章目录 前言第二、三章 关系数据库和标准语言SQL2.1 关系2…

Unity RectTransform·屏幕坐标转换

RectTransform转屏幕坐标 分两种情况 Canvas渲染模式为Overlay时&#xff0c;使用此方式 public Rect GetScreenCoordinatesOfCorners(RectTransform rt) {var worldCorners new Vector3[4];rt.GetWorldCorners(worldCorners);var result new Rect(worldCorners[0].x,world…

Redis--持久化机制详解

什么是redis持久化&#xff1f; Redis持久化是将内存的数据持久化到磁盘上&#xff0c;防止Redis宕机或者断点的时候内存中的数据丢失&#xff0c;把内存中的数据写入到磁盘的过程叫持久化。 Redis持久化的方式&#xff1f; RDB&#xff08;Redis DataBase&#xff09;&…

无法调试MFC源码

VS无法调试MFC源码 起初 有时候就是这么无奈&#xff0c;MFC源码各种问题没有办法调试&#xff0c;可是又想看下代码如何调用&#xff0c;里面做了些什么&#xff0c;从哪儿调出&#xff0c;学习一下大神的思路什么的。整理一下有可能的原因。 检查生成代码设置 需要设置正…