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. P2024 食物链(种类并查集)

    P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动 ...

  2. Java——Java泛型

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...

  3. C - A Plug for UNIX POJ - 1087 网络流

    You are in charge of setting up the press room for the inaugural meeting of the United Nations Inter ...

  4. print函数的全面认识

    # 输出打印 数字 print(123) a = 100 print(a) # 输出打印 字符串 print('字符串123') print('''锄禾日当午 汗滴禾下土''') # 输出打印 列表 ...

  5. springboot配置静态资源访问路径

    其实在springboot中静态资源的映射文件是在resources目录下的static文件夹,springboot推荐我们将静态资源放在static文件夹下,因为默认配置就是classpath:/s ...

  6. spring mvc从后台往前台传参数的三种方式

    第一种:使用Model对象(常用) 第一步:使用model对象往前台传递数据 第二步:在jsp中接收从后台传递过来的参数 第二种:使用HttpServletRequest对象 第一步:使用HttpSe ...

  7. 聚合类型与POD类型

    Lippman在<深度探索C++对象模型>的前言中写道: I have heard a number of people over the years voice opinions sim ...

  8. JPA与hibernate-------JPA

    ORM概述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数据库 ...

  9. Java三大特征:封装 继承 多态

    内部类:成员内部类.静态内部类.方法内部类.匿名内部类. 内部类:定义在另外一个类里面的类,与之对应,包含内部类的外部类被称为外部类. 内部类的作用:(1)内部类提供了更好的封装,可以把内部类隐藏在外 ...

  10. 【FreeRTOS学习03】小白都能懂的Task Management 任务管理基本概念介绍

    在FreeRTOS中,线程的术语又可以被称之为任务,或许这样更加合适,本文将介绍任务的创建/删除,任务参数的使用,以及任务优先级: 1 软实时和硬实时 硬实时系统的任务运行正确性与响应时限是紧密相关的 ...