管道流PiedInputStream和PipeOutputStream
2012-03-18 18:39 党飞 阅读(849) 评论(0) 收藏 举报---------------------- android培训、java培训、期待与您交流! ----------------------
以前我们操作流的时候,输出流和输入流是没有关系的,读写文件时要有一个中转站(例如byte数组)。
但管道流的输入流和输出流是连接的,就像一个管道的两端。看看管道输出流的API:
可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为处于 毁坏 状态。
从这里我们不难看出,管道流的操作过程,管道的两端要分别启动一个线程,管道输入端写入数据,管道输出端读取数据。
下面看一个具体实现过程:
public class Test1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PipedInputStream in=new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
try {
in.connect(out);
Read r = new Read(in);
Write w = new Write(out);
new Thread(r).start();
new Thread(w).start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Read implements Runnable{
private PipedInputStream in;
Read(PipedInputStream in){
this.in=in;
}
public void run(){
try{
byte[] buf = new byte[1024];
int len = in.read(buf);
String str= new String(buf,0,len);
System.out.println(str);
in.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
class Write implements Runnable{
private PipedOutputStream out;
Write(PipedOutputStream out){
this.out=out;
}
public void run(){
try {
out.write("dei dei".getBytes());
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
浙公网安备 33010602011771号