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的更多相关文章

  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. P4768 [NOI2018]归程(kruskal 重构树)

    洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权 ...

  2. unittest(discover 批量执行用例)

    import unittest dir = "D:\\work_doc\\pycharm2\\python_Basics" #自动化用例所存放的路径 suit = unittest ...

  3. redis系列之3----redis高级应用(主从、事务与锁、持久化)

    文章主目录 安全性设置 主从复制 事务与锁 持久化机制 发布以及订阅消息 上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下 ...

  4. 复数(complex)

    表示复数信息 a = 12.3+4j print('a的类型为:', type(a)) # 运行结果:a的类型为: <class 'complex'> print(a.real) # 实部 ...

  5. D. Ehab the Xorcist(纯构造方法)

    \(如果觉得下面难以理解,可以去这里看一种较为简单的解法\):saf \(这个题嘛,首先要明确异或的性质:相同为0,不同为1.\) \(举个例子,我们来构造u=15和v=127的情况\) \(注意到, ...

  6. Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组

    需求分析:键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符 思路: 1.键盘录入字符串 2.遍历字符串,将每个字符存储到集合中 3.将集合中重复的字符去掉 4.创建新集合,遍历老集合,获取老 ...

  7. 自动化测试po模式是什么?自动化测试po分层如何实现?-附详细源码

    一.什么是PO模式 全称:page object model  简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! ​ 主要分三层: 1.基础层BaseP ...

  8. masonry中的make,remake,update

    - (void)viewDidLoad { [super viewDidLoad]; self.navigationController.navigationBar.translucent = NO; ...

  9. Spring全家桶之spring boot(二)

    spring boot的两种配置文件: 虽然spring boot可以帮助我们进行一些配置项,但是有些内容还是需要开发者自己进行配置,因此spring boot提供了配置文件以供开发者配置.sprin ...

  10. 视口viewport

    一.viewport 1. 何为视口? 视口是浏览器显示网页的矩形区域. 2. 默认视口:模拟一个大约1000像素宽的视口. 理想视口:因设备.操作系统.浏览器而异,一般而言,手机宽带大约在300-5 ...