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)

  1. public class PipedSender implements Runnable{
  2. private static char[] chs = new char[]
  3. {'a','b','c','d','e','f','g','h','i','j','k','l','m',
  4. 'n','o','p','q','r','s','t','u','v','w','x','y','z'};
  5. PipedWriter wr = new PipedWriter();
  6. public PipedWriter getPipedWriter() {
  7. return wr;
  8. }
  9. public void run() {
  10. sendOne(); // 写入较短数据
  11. sendMove();// 写入较长数据
  12. }
  13. /**
  14. * 写入较短数据
  15. */
  16. private void sendOne() {
  17. try {
  18. wr.write("this is a PipedSender");
  19. }catch(Exception e) {
  20. e.printStackTrace();
  21. }finally {
  22. try {
  23. if (wr != null)
  24. wr.close();
  25. }catch(Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30.  
  31. /**
  32. * 写入较长数据
  33. */
  34. private void sendMove() {
  35. try {
  36. StringBuffer sb = new StringBuffer();
  37. for (int i = 0; i < 100; i++) {
  38. sb.append("0123456789");
  39. }
  40. sb.append(new String(chs));
  41. String str = sb.toString();
  42. wr.write(chs);
  43. wr.write(str);
  44. }catch(Exception e) {
  45. e.printStackTrace();
  46. }finally {
  47. try {
  48. if (wr != null)
  49. wr.close();
  50. }catch(Exception e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. }

(二)、PipedReceiver(接收者对象,PipedReader)

  1. public class PipedReceiver implements Runnable {
  2.  
  3. PipedReader re = new PipedReader();
  4. public PipedReader getPipedReader() {
  5. return re;
  6. }
  7. @Override
  8. public void run() {
  9. readOne(); // 读取一次
  10. readMove(); // 全部读取
  11. }
  12. /**
  13. * 读取一次数据
  14. */
  15. private void readOne() {
  16. char[] buff = new char[2048];
  17. int len = 0;
  18. try {
  19. len = re.read(buff);
  20. System.out.println("readOne : " + new String(buff,0,len));
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }finally {
  24. try {
  25. if (re != null)
  26. re.close();
  27. }catch(Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32. /**
  33. * 全部读取
  34. */
  35. private void readMove() {
  36. char[] buff = new char[1024];
  37. int len = 0;
  38. try {
  39. while(true) {
  40. len = re.read(buff);
  41. if(len == -1) break;
  42. System.out.println("readMove : " + new String(buff,0,len));
  43. }
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. }finally {
  47. try {
  48. if (re != null)
  49. re.close();
  50. }catch(Exception e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. }

(三)、PipedDemo(主线程main类)

  1. public class PipedDemo {
  2. public static void main(String[] args) {
  3. PipedSender se = new PipedSender();
  4. PipedReceiver re = new PipedReceiver();
  5.  
  6. PipedWriter out = se.getPipedWriter();
  7. PipedReader in = re.getPipedReader();
  8. try {
  9. in.connect(out);// 将输入流与输出流建立连接
  10. // 开启线程
  11. new Thread(se).start();
  12. new Thread(re).start();
  13. }catch(Exception e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. }

Java IO(十三)PipedReader 和 PipedWriter的更多相关文章

  1. 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类

    目录:系统学习 Java IO---- 目录,概览 Reader Reader 类是 Java IO API 中所有 Reader 子类的基类. Reader 类似于 InputStream ,除了它 ...

  2. 系统学习 Java IO ---- 目录,概览

    Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...

  3. java io系列20之 PipedReader和PipedWriter

    本章,我们学习PipedReader和PipedWriter.它们和“PipedInputStream和PipedOutputStream”一样,都可以用于管道通信. PipedWriter 是字符管 ...

  4. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  5. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  6. Java IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  7. [Java IO]03_字符流

    Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ...

  8. java io 流分类表

    Java输入/输出流体系中常用的流分类(表内容来自java疯狂讲义) 注:下表中带下划线的是抽象类,不能创建对象.粗体部分是节点流,其他就是常用的处理流. 流分类 使用分类 字节输入流 字节输出流 字 ...

  9. java io 输入输出流

    数据流分类: 流序列中的数据既可以是未经加工的原始二进制数据, 也可以是经一定编码处理后符合某种格式规定的特定数据. 因此Java中的流分为两种: 1) 字节流:数据流中最小的数据单元是字节 2) 字 ...

随机推荐

  1. 1) drf 整体了解

    一.接口 """ 1.什么是接口:url+请求参数+响应数据 | 接口文档 ​ 2.接口规范: url:https,api,资源(名词复数),v1,get|post表示操 ...

  2. Datasource Server returns invalid timezone问题

    今天在学习一个项目的时候,idea中的datasource没有配置,后来发现mysql没有连接,于是下载了最新版的jdbc.jar包,连接mysql完成后,想test一下mysql connect,结 ...

  3. JAVA设计模式之工厂系列(factory)

    任何可以产生对象的方法或者类,都可以称之为工厂.单例就是所谓的静态工厂. 为什么jdk中有了new,还需要工厂呢? a.灵活的控制生产过程 b.给对象加修饰.或者给对象加访问权限,或者能够在对象生产过 ...

  4. Matlab矩阵总结

  5. CF-612D The Union of k-Segments 差分

    D. The Union of k-Segments 题意 给出n个线段,以及一个数字k,让求出有哪些线段:线段上所有的点至少被覆盖了k次. 思路 假如忽略掉线段的左右端点范围,肯定是使用差分来维护每 ...

  6. 初识spring boot maven管理--HelloWorld

    配置文件配置好 了之后可以进行第一个例子的编写了! @Controller @EnableAutoConfiguration() public class SampleController { pri ...

  7. 学习笔记:平衡树-splay

    嗯好的今天我们来谈谈cosplay splay是一种操作,是一种调整二叉排序树的操作,但是它并不会时时刻刻保持一个平衡,因为它会根据每一次操作把需要操作的点旋转到根节点上 所谓二叉排序树,就是满足对树 ...

  8. 《C程序设计语言》 练习3-3

    问题描述 编写expand(s1,s2),将字符串s1中类似于a-z类的速记符号在字符串s2中扩展为等价的完整列表abc.....xyz.该函数可以处理大小写字母和数字,并可以处理a-b-c,a-z0 ...

  9. Dubbo对Spring Cloud说:来老弟,我要拥抱你

    项目地址 https://github.com/yinjihuan/kitty-cloud 前言 Kitty Cloud 开源后有以为朋友在 GitHub 上给我提了一个 issues,问为什么项目中 ...

  10. SpringBoot + react app 项目,解决跨域问题的配置(跳坑含泪总结,亲测有效)

    方法一: 对某一接口配置,可以在方法上添加 @CrossOrigin 注解 @CrossOrigin(origins = {"http://localhost:8110", &qu ...