Java IO(十三)PipedReader 和 PipedWriter
Java IO(十三)PipedReader 和 PipedWriter
一、介绍
PipedReader 和 PipedWriter 分别是管道字符输入流和管道字符输出流,它们同 PipedInputStream 和 PipedOutputStream 一样,用于管道通讯,相关功能都是类似的。它们的作用是可以通过管道进行线程间的通讯。在使用管道通信时,必须将 PipedWriter 和 PipedReader 配套使用。
- PipedReader :管道字符输入流,继承于Reader。
- PipedWriter:管道字符输出流,继承于Writer。
二、构造方法
(一)、PipedReader
(二)、PipedWriter
三、常用API
(一)、PipedReader
(二)、PipedWriter
四、实例
多线程通过 PipedWriter 和 PipedReader 进行线程间同通讯,下面例子分别定义三个类:PipedDemo(主线程main类),PipedSender(发送者对象,PipedWriter)、PipedReceiver(接收者对象,PipedReader)。实例中只贴出主要代码。同 PipedInputStream 和 PipedOutputStream 实例类似。
注意点:
管道输入流 PipedInputStream 与管道输出流 PipedOutputStream 建立连接
建立连接一般使用 connect() 方法连接或在创建输入流对象时,传递连接该管道的输出流对象。
connect() ,如:out.connect(in) 和 in.connect(out) 是等价的,开发时只能选择其中的一个而不能两个 connect 同时调用,否则会抛出 java.io.IOException: Already connected 异常。
创建流对象,如:PipedWriter out = new PipedWriter (in),in 为 PipedReader 对象,必须先实例化使用,否则会报 java.lang.NullPointerException 异常。PipedWriter out = new PipedWriter (in) 与 PipedReader in = new PipedReader (out) 是等价的,开发时传递的流对象作为参数必须实例化,然后进行传递。
(一)、PipedSender(发送者对象,PipedWriter)
- public class PipedSender implements Runnable{
- private static char[] chs = new char[]
- {'a','b','c','d','e','f','g','h','i','j','k','l','m',
- 'n','o','p','q','r','s','t','u','v','w','x','y','z'};
- PipedWriter wr = new PipedWriter();
- public PipedWriter getPipedWriter() {
- return wr;
- }
- public void run() {
- sendOne(); // 写入较短数据
- sendMove();// 写入较长数据
- }
- /**
- * 写入较短数据
- */
- private void sendOne() {
- try {
- wr.write("this is a PipedSender");
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- try {
- if (wr != null)
- wr.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 写入较长数据
- */
- private void sendMove() {
- try {
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < 100; i++) {
- sb.append("0123456789");
- }
- sb.append(new String(chs));
- String str = sb.toString();
- wr.write(chs);
- wr.write(str);
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- try {
- if (wr != null)
- wr.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
(二)、PipedReceiver(接收者对象,PipedReader)
- public class PipedReceiver implements Runnable {
- PipedReader re = new PipedReader();
- public PipedReader getPipedReader() {
- return re;
- }
- @Override
- public void run() {
- readOne(); // 读取一次
- readMove(); // 全部读取
- }
- /**
- * 读取一次数据
- */
- private void readOne() {
- char[] buff = new char[2048];
- int len = 0;
- try {
- len = re.read(buff);
- System.out.println("readOne : " + new String(buff,0,len));
- } catch (IOException e) {
- e.printStackTrace();
- }finally {
- try {
- if (re != null)
- re.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 全部读取
- */
- private void readMove() {
- char[] buff = new char[1024];
- int len = 0;
- try {
- while(true) {
- len = re.read(buff);
- if(len == -1) break;
- System.out.println("readMove : " + new String(buff,0,len));
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally {
- try {
- if (re != null)
- re.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
(三)、PipedDemo(主线程main类)
- public class PipedDemo {
- public static void main(String[] args) {
- PipedSender se = new PipedSender();
- PipedReceiver re = new PipedReceiver();
- PipedWriter out = se.getPipedWriter();
- PipedReader in = re.getPipedReader();
- try {
- in.connect(out);// 将输入流与输出流建立连接
- // 开启线程
- new Thread(se).start();
- new Thread(re).start();
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
Java IO(十三)PipedReader 和 PipedWriter的更多相关文章
- 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类
目录:系统学习 Java IO---- 目录,概览 Reader Reader 类是 Java IO API 中所有 Reader 子类的基类. Reader 类似于 InputStream ,除了它 ...
- 系统学习 Java IO ---- 目录,概览
Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...
- java io系列20之 PipedReader和PipedWriter
本章,我们学习PipedReader和PipedWriter.它们和“PipedInputStream和PipedOutputStream”一样,都可以用于管道通信. PipedWriter 是字符管 ...
- Java IO之字符流和文件
前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- [Java IO]03_字符流
Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类. 它的定义如下: public abstra ...
- java io 流分类表
Java输入/输出流体系中常用的流分类(表内容来自java疯狂讲义) 注:下表中带下划线的是抽象类,不能创建对象.粗体部分是节点流,其他就是常用的处理流. 流分类 使用分类 字节输入流 字节输出流 字 ...
- java io 输入输出流
数据流分类: 流序列中的数据既可以是未经加工的原始二进制数据, 也可以是经一定编码处理后符合某种格式规定的特定数据. 因此Java中的流分为两种: 1) 字节流:数据流中最小的数据单元是字节 2) 字 ...
随机推荐
- 1) drf 整体了解
一.接口 """ 1.什么是接口:url+请求参数+响应数据 | 接口文档 2.接口规范: url:https,api,资源(名词复数),v1,get|post表示操 ...
- Datasource Server returns invalid timezone问题
今天在学习一个项目的时候,idea中的datasource没有配置,后来发现mysql没有连接,于是下载了最新版的jdbc.jar包,连接mysql完成后,想test一下mysql connect,结 ...
- JAVA设计模式之工厂系列(factory)
任何可以产生对象的方法或者类,都可以称之为工厂.单例就是所谓的静态工厂. 为什么jdk中有了new,还需要工厂呢? a.灵活的控制生产过程 b.给对象加修饰.或者给对象加访问权限,或者能够在对象生产过 ...
- Matlab矩阵总结
- CF-612D The Union of k-Segments 差分
D. The Union of k-Segments 题意 给出n个线段,以及一个数字k,让求出有哪些线段:线段上所有的点至少被覆盖了k次. 思路 假如忽略掉线段的左右端点范围,肯定是使用差分来维护每 ...
- 初识spring boot maven管理--HelloWorld
配置文件配置好 了之后可以进行第一个例子的编写了! @Controller @EnableAutoConfiguration() public class SampleController { pri ...
- 学习笔记:平衡树-splay
嗯好的今天我们来谈谈cosplay splay是一种操作,是一种调整二叉排序树的操作,但是它并不会时时刻刻保持一个平衡,因为它会根据每一次操作把需要操作的点旋转到根节点上 所谓二叉排序树,就是满足对树 ...
- 《C程序设计语言》 练习3-3
问题描述 编写expand(s1,s2),将字符串s1中类似于a-z类的速记符号在字符串s2中扩展为等价的完整列表abc.....xyz.该函数可以处理大小写字母和数字,并可以处理a-b-c,a-z0 ...
- Dubbo对Spring Cloud说:来老弟,我要拥抱你
项目地址 https://github.com/yinjihuan/kitty-cloud 前言 Kitty Cloud 开源后有以为朋友在 GitHub 上给我提了一个 issues,问为什么项目中 ...
- SpringBoot + react app 项目,解决跨域问题的配置(跳坑含泪总结,亲测有效)
方法一: 对某一接口配置,可以在方法上添加 @CrossOrigin 注解 @CrossOrigin(origins = {"http://localhost:8110", &qu ...