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) 字 ...
随机推荐
- python(json 模块)
1.Json 定义 定义:JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.JSON 的数据格式其实就是 python 里面的字典格式,里 ...
- vue获取当前时间 实时刷新
需求:获取当前系统时间,在页面上展示 年月日 时分秒 ,并且实时刷新,和系统时间保持一致 第一步:在deta 里面声明两个变量第二步:把时间调用写在created() 生命周期里面,进入页面就需要调用 ...
- java23种设计模式——泡MM版
一.创建型模式 1.FACTORY:追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,固然口味有所不同,但不管你带MM往麦当劳或肯德基,只管向服务员说;来四个鸡翅就行了.麦当劳和肯德 ...
- (二)Redis在Mac下的安装与SpringBoot中的配置
1 下载Redis 官网下载,下载 stable 版本,稳定版本. 2 本地安装 解压:tar zxvf redis-6.0.1.tar.gz 移动到: sudo mv redis-6.0.1 /us ...
- springmvc与struts2执行流程比较
之前写过一篇struts2的执行流程的文章了,这里对struts2的流程就不做过多的分析,这篇文章主要分析spring-mvc的执行流程以 及struts2与spring-mvc的差别. 1.stru ...
- Coursera课程笔记----Write Professional Emails in English----Week 5
Culture Matters(Week 5) High/Low Context Communication High Context Communication The Middle East, A ...
- Day_08【面向对象】扩展案例3_使用多态的形式创建缉毒狗对象,调用缉毒方法和吼叫方法
分析以下需求,并用代码实现: 1.定义动物类: 行为: 吼叫:没有具体的吼叫行为 吃饭:没有具体的吃饭行为 2.定义缉毒接口 行为: 缉毒 3.定义缉毒狗:犬的一种 行为: 吼叫:汪汪叫 吃饭:狗啃骨 ...
- 借助DEM生成高精度SketchUp地形,地形分析如此简单
SketchUp因其自身友好的界面和强大的功能,已经成为建筑规划设计常用工具.无论是摩天大楼还是独栋别墅,小区规划还方案推敲和方案表现上都显示出了不错的实力. 然而SketchUp异形建模能力对比3d ...
- STM32 Cube之旅-尝试新的开发方式
尝试使用Cube进行一些开发学习,这里对此做一个梗概,先有一个全面的了解. 文章目录 Cube全家桶 CubeMX CubeIDE CubeProg 结语 Cube全家桶 曾几何时,ST刚推出Cube ...
- 广义Fibonacci数列模n的循环节
见这里:http://blog.csdn.net/ACdreamers/article/details/25616461 有详细的分析推理 只找出了循环节的上限,设 f[n] = (af[n - 1] ...