JavaSE笔记15.12-IO流-管道流
一. 概述
1. PipedInputStream
- 管道输入流,应连接到管道输出流
- 管道输入流中实际是用了一个默认为1024字节大小的循环缓冲区,写入管道输出流的数据实际上保存到了对应的管道输入流的内部缓冲区;从管道输入流执行读操作时,读取的数据实际上来自这个内部缓冲区
- 管道的读写操作是互相阻塞的,当缓冲区为空时读操作阻塞,当缓冲区满时写操作阻塞;如果操作管道输入流和管道输出流的线程是同一个线程,可能会造成死锁
构造方法
//创建尚未链接的PipedInputStream
PipedInputStream();
//创建一个尚未连接的PipedInputStream,并对管道缓冲区使用指定的管道大小
PipedInputStream(int pipeSize);
//创建PipedInputStream,使其连接到管道输出流src
PipedInputStream(PipedOutputStream src);
//创建一个PipedInputStream,使其连接到管道输出流src,并对管道缓冲区使用指定的管道大小
PipedInputStream(PipedOutputStream src,int pipeSize);
特有方法
//使此管道输入流连接到管道输出流src
void connect(PipedOutputStream src)
2. PipedOutputStream
管道输出流,可连接到管道输入流以创建管道通信
构造方法
//创建一个尚未连接到管道输入流的管道输出流
PipedOutputStream();
//创建连接到指定管道输入流的管道输出流
PipedOutputStream(PipedInputStream snk);
特有方法
//将此管道输出流连接到接收器
void connect(PipedInputStream snk);
3. 注意事项
数据由某个线程从PipedInputStream对象读取,并由其他线程将其写入到相应的PipedOutputStream;
不建议从单个线程使用这两个对象
二. 例子
import java.io.*;
//读取线程,从PipedInputStream对象读取数据
class Read implements Runnable{
private PipedInputStream in;
Read(PipedInputStream in){
this.in= in;
}
@Override
public void run() {
try{
byte[] buf=new byte[1024];
System.out.println("读取前。。没有数据阻塞");
//2. PipedInputStream从内部缓冲区中读取数据
int len=in.read(buf);
System.out.println("读到数据。。阻塞结束");
String s=new String(buf,0,len);
System.out.println(s);
in.close();
} catch (IOException e) {
throw new RuntimeException("管道输入流失败");
}
}
}
//写入线程,将数据写入到PipedOutputStream对象
class Write implements Runnable{
private PipedOutputStream out;
Write(PipedOutputStream out){
this.out=out;
}
@Override
public void run() {
try{
Thread.sleep(6000);
//1. 写入PipedOutputStream的数据,实际上写入到对应PipedInputStream的内部缓冲区
out.write("Pipe is coming".getBytes());
out.close();
} catch (Exception e) {
throw new RuntimeException("管道输出流失败");
}
}
}
//运行代码
public class PipedStreamDemo {
public static void main(String[] args) throws IOException {
PipedInputStream in=new PipedInputStream();
PipedOutputStream out=new PipedOutputStream();
in.connect(out);
//建立线程对象
Read r=new Read(in);
Write w=new Write(out);
Thread tr=new Thread(r);
Thread tw=new Thread(w);
tr.start();
tw.start();
}
}