java基础之IO流--PipedOutputStream(涉及到多线程技术的管道流,比较特殊)
来源:互联网 发布:淘宝详情关联模板 编辑:程序博客网 时间:2024/05/21 11:17
管道流:管道一头读数据,另一头写数据,这就涉及到多线程的问题,如何保证读取一致性
管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。
如何将管道输入流与管道输出流结合在一起?
第一种方法:使用管道输入流的构造函数
PipedInputStream(PipedOutputStream src)
创建 PipedInputStream,使其连接到管道输出流 src。
第二种方法:使用管道输入流的connect方法
connect(PipedOutputStream src)
使此管道输入流连接到管道输出流 src。
package newFeatures8;import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;public class PipedIODemo{public static void main(String[] args) throws IOException {PipedInputStream in=new PipedInputStream();PipedOutputStream out=new PipedOutputStream();in.connect(out);Read read=new Read(in);Write write=new Write(out);//谁先抢到cup的执行权不重要new Thread(read).start();new Thread(write).start();}}class Read implements Runnable{ private PipedInputStream in; public Read(PipedInputStream in){ if (in!=null) { this.in=in;}else{throw new NullPointerException("传入对象为空");} }@Overridepublic void run() {try {byte[] buf=new byte[1024];//1k:512字符System.out.println("读取前没有数据就阻塞");int len=in.read(buf);System.out.println("读到数据阻塞结束!");//读到多少写多少//从字节数组里获取指定长度的子数组,然后构成新的字符串String content=new String(buf,0,len);System.out.println(content);} catch (Exception e) { throw new RuntimeException("管道输入流失败");}finally {try {if(in!=null) in.close();} catch (IOException e) {e.printStackTrace();}}}}class Write implements Runnable{ private PipedOutputStream out; public Write(PipedOutputStream out){ if (out!=null) { this.out=out;}else{throw new NullPointerException("传入对象为空");} }@Overridepublic void run() {try {System.out.println("开始写入数据,等待6秒后");Thread.sleep(6000);//注意:写出的数据写到哪去了呢?写到了与之关联的管道输入流里去了out.write("piped lai la".getBytes());} catch (Exception e) { throw new RuntimeException("管道输出流失败");}finally {try {if(out!=null)out.close();} catch (IOException e) {e.printStackTrace();}}}}
阅读全文
0 0
- java基础之IO流--PipedOutputStream(涉及到多线程技术的管道流,比较特殊)
- 【java基础:IO】管道流PipedInputStream和PipedOutputStream的Demostration
- Java IO--管道流PipedOutputStream/PipedInputStream
- java 管道流之PipedOutputStream和PipedInputStream
- Java的IO流系列: FileOutputStream/PipedOutputStream
- Java-IO之管道(PipedInputStream和PipedOutputStream)
- java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例
- java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例
- 管道流 PipedInpuStream 、PipedOutputStream
- java(5)--IO流之PipedInputStream和PipedOutputStream
- Java IO系列6 字节流之PipedInputStream与PipedOutputStream
- Java IO操作——线程间通讯流(管道流 PipedOutputStream、PipedInputStream)
- Java里的管道输入流 PipedInputStream与管道输出流 PipedOutputStream
- 管道流PipedInputStream 和PipedOutputStream
- PipedInputStream和PipedOutputStream管道流
- java IO之管道流
- java 管道流PipedOutputStream和PipedInputStream基本操作
- java学习笔记:管道流PipedInputStream和PipedOutputStream
- rpm: /usr/bin/rpmspec: No such file or directory error 解决办法
- Android 添加菜单和返回按钮
- NYOJ 2356 哈希计划(模拟)
- 2.分层分离
- P09: 背包问题问法的变化
- java基础之IO流--PipedOutputStream(涉及到多线程技术的管道流,比较特殊)
- bzoj 2434: [Noi2011]阿狸的打字机
- python3提示name 'cmp' is not defined
- 支付宝网页扫码支付
- 链表合并(6)
- synchronized和static synchronized的区别
- C++中__int64用法
- HDU 2602 Bone Collector(01背包)
- 捡捡java文件下载中的芝麻