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. 聊聊select, poll 和 epoll

    聊聊select, poll 和 epoll 假设项目上需要实现一个TCP的客户端和服务器从而进行跨机器的数据收发,我们很可能翻阅一些资料,然后写出如下的代码. 服务端 void func(int s ...

  2. 【Hexo】使用Hexo+github pages+travis ci 实现自动化部署

    目录 一.说明 二.成品展示 三.前期准备 本地安装 node.js 本地安装 git github 账号 创建仓库 travis ci 账号 四.安装 Hexo 五.使用 hexo 搭建博客 六.部 ...

  3. python模块之time and datetime

    time # python3 # coding = utf-8 import time timestamp = time.time() print('timestamp:%s, type: %s' % ...

  4. JAVA设计模式之组合模式(composite)

    组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...

  5. C# 数据操作系列 - 0. 序言

    0. 前言 在上一个系列中,我们初步浏览了一下C#的基础知识.这句话的意思就是C#基础知识系列完结了,撒花.当然,并不是因为C#已经讲完了.正是因为我们轻轻地叩开了那扇门,才能看到门后面那瑰丽的世界. ...

  6. Day_09【常用API】扩展案例2_测试小字符串在大字符串中出现的次数

    分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: 请输入大字符串: woaiheima,heimabutongy ...

  7. 【Hadoop离线基础总结】MapReduce自定义InputFormat和OutputFormat案例

    MapReduce自定义InputFormat和OutputFormat案例 自定义InputFormat 合并小文件 需求 无论hdfs还是mapreduce,存放小文件会占用元数据信息,白白浪费内 ...

  8. Android广播机制(2)

    目录 发送自定义广播 发送标准广播 步骤 跨进程广播 步骤 发送有序广播 使用本地广播 实例 本地广播的优势 发送自定义广播 发送标准广播 步骤 1.定义一个广播接收器来接收此广播,新建MyBroad ...

  9. LeetCode寻找两个有序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...

  10. 我的linux学习日记day4

    一.打包压缩与搜索命令 1.tar命令 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包里有哪些文件 -j 用bzip2来压缩或解压 -z 用gzip压缩或解压 -v 显示过程 -f 目标文件 ...