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

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

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

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

 

一、java.io

1.59 PipedReader

PipedReader 是 Java I/O 包中的一个类,用于从管道中读取字符数据。它通常与 PipedWriter 一起使用,用于线程之间的通信。

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

  • PipedReader(PipedWriter src): 创建一个连接到指定管道写入器的管道输入流。

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

  • int read() throws IOException: 从管道读取一个字符。

  • int read(char[] cbuf, int off, int len) throws IOException: 将字符读入数组的某一部分。

  • void close() throws IOException: 关闭该流并释放与之关联的所有系统资源。

简单使用例子:

以下是一个简单的例子,演示了如何使用 PipedReader 从管道中读取字符数据:

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

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

应用场景

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

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

javaCopy code
import java.io.*;
​
public class ThreadCommunicationExample {
​
    public static void main(String[] args) {
        try {
            PipedWriter pipedWriter = new PipedWriter();
            PipedReader pipedReader = new PipedReader();
            pipedReader.connect(pipedWriter);
​
            // Producer Thread
            Thread producerThread = new Thread(() -> {
                try {
                    for (int i = 1; i <= 5; i++) {
                        pipedWriter.write(i);
                        Thread.sleep(1000);
                    }
                    pipedWriter.close();
                } catch (IOException | InterruptedException e) {
                    e.printStackTrace();
                }
            });
​
            // Consumer Thread
            Thread consumerThread = new Thread(() -> {
                try {
                    int data;
                    while ((data = pipedReader.read()) != -1) {
                        System.out.println("Received: " + data);
                    }
                    pipedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
​
            producerThread.start();
            consumerThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 数据处理管道:可以使用管道流来创建数据处理管道,其中一个线程写入数据到 PipedWriter,另一个线程从 PipedReader 中读取数据进行处理。

javaCopy code
import java.io.*;
​
public class DataProcessingPipeline {
​
    public static void main(String[] args) {
        try {
            PipedWriter pipedWriter = new PipedWriter();
            PipedReader pipedReader = new PipedReader();
            pipedReader.connect(pipedWriter);
​
            // Producer Thread
            Thread producerThread = new Thread(() -> {
                try {
                    String data = "Data to be processed";
                    pipedWriter.write(data);
                    pipedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
​
            // Consumer Thread
            Thread consumerThread = new Thread(() -> {
                try {
                    StringBuilder stringBuilder = new StringBuilder();
                    int data;
                    while ((data = pipedReader.read()) != -1) {
                        stringBuilder.append((char) data);
                    }
                    System.out.println("Processed Data: " + stringBuilder.toString());
                    pipedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
​
            producerThread.start();
            consumerThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

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

职场例子

下面是一个项目实战例子,演示了如何使用 PipedReaderPipedWriter 实现一个简单的消息传递系统,其中包括一个服务器端和多个客户端,服务器接收来自客户端的消息并广播给所有客户端。

javaCopy code
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
​
public class SimpleChatServer {
    private static final int PORT = 8888;
    private static final List<PipedWriter> clientWriters = new ArrayList<>();
​
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            System.out.println("Server started. Listening on port " + PORT);
​
            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.out.println("New client connected: " + clientSocket);
​
                // Create piped streams for communication with client
                PipedWriter clientWriter = new PipedWriter();
                PipedReader clientReader = new PipedReader(clientWriter);
​
                // Add client writer to list
                clientWriters.add(clientWriter);
​
                // Start thread to handle client communication
                Thread clientThread = new Thread(new ClientHandler(clientSocket, clientReader));
                clientThread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    private static class ClientHandler implements Runnable {
        private final Socket clientSocket;
        private final PipedReader clientReader;
​
        public ClientHandler(Socket clientSocket, PipedReader clientReader) {
            this.clientSocket = clientSocket;
            this.clientReader = clientReader;
        }
​
        @Override
        public void run() {
            try (BufferedReader reader = new BufferedReader(clientReader)) {
                String message;
                while ((message = reader.readLine()) != null) {
                    System.out.println("Received from client " + clientSocket + ": " + message);
                    broadcast(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
​
        private void broadcast(String message) {
            System.out.println("Broadcasting message: " + message);
            for (PipedWriter writer : clientWriters) {
                try {
                    writer.write(message + "\n");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

上述代码实现了一个简单的聊天服务器,它监听指定端口,等待客户端连接。一旦有客户端连接,服务器将为其创建一个独立的线程来处理通信。每个客户端都有一个专用的 PipedWriter 用于向服务器发送消息,而服务器端使用 PipedReader 从每个客户端读取消息。服务器接收到消息后,会将其广播给所有连接的客户端。

你可以编写一个相应的客户端来连接到这个服务器,并与其他客户端进行通信。

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

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

相关文章

多路转接之epoll

常用的三个API&#xff1a; epoll_create(); //例如 int epfd epoll(10);创建一棵有10个结点的红黑树&#xff0c;注意&#xff1a;这个数只是对内核建议的数值&#xff0c;内核参照这个参数去构建epoll_ctrl();//参数2 op可以取值 EPOLL_CTL_ADD/MOD/DELevents:EPOLLIN/…

C++进阶(二) 多态

一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c; 具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学…

Sora:探索大型视觉模型的前世今生、技术内核及未来趋势

Sora&#xff0c;一款由OpenAI在2024年2月推出的创新性文生视频的生成式AI模型&#xff0c;能够依据文字说明&#xff0c;创作出既真实又富有想象力的场景视频&#xff0c;展现了其在模拟现实世界方面的巨大潜能。本文基于公开技术文档和逆向工程分析&#xff0c;全面审视了Sor…

java八股文复习-----2024/03/03

1.接口和抽象类的区别 相似点&#xff1a; &#xff08;1&#xff09;接口和抽象类都不能被实例化 &#xff08;2&#xff09;实现接口或继承抽象类的普通子类都必须实现这些抽象方法 不同点&#xff1a; &#xff08;1&#xff09;抽象类可以包含普通方法和代码块&#x…

work 3/1

1>机械臂 #include <head.h> #define SER_POTR 8899 #define SER_IP "192.168.125.223" int main(int argc, const char *argv[]) {//创建套接字int cfdsocket(AF_INET,SOCK_STREAM,0);if(cfd-1){perror("");return -1;}//链接struct sockaddr_i…

腾讯云4核8G服务器申请费用多少?性能如何?支持几个人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

【详识JAVA语言】面向对象程序三大特性之三:多态

多态 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 多态实现条件 在java中要实现多态&#xff0c;必须要满足如下几个条件&#xff0c;缺一不可&#xf…

Sqli-labs靶场第20关详解[Sqli-labs-less-20]自动化注入-SQLmap工具注入

Sqli-labs-Less-20 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 登录后会有记录 Cookie 值 设想如果在Cookie尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会执行…

Hololens2开发环境配置及项目生成部署

Hololens2开发环境配置及项目生成部署 Hololens2开发环境配置及项目生成部署一、官方文档及推荐配置说明1.官方文档介绍2.推荐配置及配置说明 二、安装步骤0.现有Visual Stuido和Unity卸载1.Windows SDK安装2.Visual Studio安装3.Unity安装4.MRTK配置 三、初次环境配置1.新建Un…

C++进阶(三) 二叉搜索树

一、二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节…

Postman上传文件的操作方法

前言 调用某个接口&#xff0c;测试上传文件功能。一时间不知如何上传文件&#xff0c;本文做个操作记录&#xff0c;期望与你有益。 步骤一、设置Headers key:Content-Type value:multipart/form-data 步骤二、设置Body 选择form-data key:file下拉框选择file类型value&…

2024年【道路运输企业主要负责人】考试报名及道路运输企业主要负责人模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业主要负责人考试报名根据新道路运输企业主要负责人考试大纲要求&#xff0c;安全生产模拟考试一点通将道路运输企业主要负责人模拟考试试题进行汇编&#xff0c;组成一套道路运输企业主要负责人全真模拟考…

Mysql学习之各种锁

锁 事务的隔离性由锁来实现 MySQL并发事务访问相同记录 并发事务访问相同记录的情况大致可以分为3种&#xff1a; 读-读的情况 读-读情况&#xff0c;即并发事务相继读取相同的记录。读取操作本身不会对记录由有任何的影响&#xff0c;并不会引起什么问题&#xff0c;所以允许…

【SQL注入】宽字节注入原理讲解

一、addslasehes()转义函数 addslashes() 是 PHP 中用于转义字符串中的特殊字符的函数之一。它会在指定的预定义字符&#xff08;单引号、双引号、反斜线和 NUL 字符&#xff09;前面添加反斜杠&#xff0c;以防止这些字符被误解为代码注入或其他意外操作。 1. 用法 string …

对程序、进程、线程、并发、并行、高并发概念的讲解

一、概述 程序、进程、线程、并发、并行和高并发是计算机科学领域中非常重要的概念。 了解进程、线程、并发和并行的概念&#xff0c;可以更好地利用计算机的多核处理器和并行计算能力&#xff0c;提高计算机性能。 了解进程和线程为操作系统中的资源管理提供了基础&#xff…

Springboot+vue的考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的考勤管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

【MySQL】表的约束——空属性、默认值、列描述、zerofill、主键、自增长、唯一键、外键

文章目录 MySQL表的约束1. 空属性2. 默认值3. 列描述4. zerofill5. 主键6. 自增长7. 唯一键8. 外键 MySQL 表的约束 MySQL中的表的约束是一种规则&#xff0c;用于限制或保护表中数据的完整性和合法性。约束可以确保数据在插入、更新或删除时满足特定的条件&#xff0c;从而维护…

笨办法学 Python3 第五版(预览)(一)

原文&#xff1a;Learn Python the Hard Way, 5th Edition (Early Release) 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 模块 1&#xff1a;Python 入门 练习 0&#xff1a;准备工作 这个练习没有代码。这只是你完成的练习&#xff0c;让你的计算机运行 Python。…

Web开发学习-HTML

第一天 固定结构 如何注释&#xff1a;vs code中使用ctrl/可以达到注释这一行的效果&#xff0c;同时再次按下ctrl/&#xff0c;可以取消注释。 HTML标签的结构 例如&#xff1a;<strong>字体加粗</strong>这个就是双标签&#xff0c;<br>换行标签&#xff…

Unity 常用的4种灯光、制作镜子、灯光的调用修改数值、

创建灯光时&#xff0c;一般用4种&#xff1a;定向光、点光源、聚光、区域光、 定向光&#xff1a;太阳 点光源&#xff1a;灯泡 聚光灯&#xff1a;手电筒 区域光&#xff1a;烘焙-贴图 灯光选择已烘焙 需要先选择被烘焙的物体&#xff0c;然后再选择Contribute GI 等待进…
最新文章