管道PipedInputStream/PipedOutputStream类
来源:互联网 发布:英伟达游戏优化扫描 编辑:程序博客网 时间:2024/06/01 11:53
六、管道PipedInputStream/PipedOutputStream类:
当需要在两个线程中读写数据的时候,由于线程的并发执行,读写的同步问题可能会发生困难,这时候可以使用管道,管道事实上是一个队列。
管道是由系统维护的一个缓冲区,当然程序员也可以自己直接指定该缓冲区的大小(只需要设置管道流类中的PIPE_SIZE属性的值)。当生产者生产出数据后,只需要将数据写入管道中,消费者只需要从管道中读取所需要的数据。利用管道的这种机制,可以将一个线程的输出结果直接连接到另一个线程的输入端口,实现两者之间的数据直接传送。
线程1
线程2
临时文件
管道
1.管道的连接:
方法之一是通过构造函数直接将某一个程序的输出作为另一个程序的输入,在定义对象时指明目标管道对象
PipedInputStream pInput=new PipedInputStream();
PipedOutputStream pOutput= new PipedOutputStream(pInput);
方法之二是利用双方类中的任一个成员函数 connect()相连接
PipedInputStream pInput=new PipedInputStream();
PipedOutputStream pOutput= new PipedOutputStream();
pinput.connect(pOutput);
2.管道的输入与输出:
输出管道对象调用write()成员函数输出数据(即向管道的输入端发送数据);而输入管道对象调用read()成员函数可以读起数据(即从输出管道中获得数据)。这主要是借助系统所提供的缓冲机制来实现的。
实例:Java的管道的输入与输出
import java.io.*;
public class PipedIO //程序运行后将sendFile文件的内容拷贝到receiverFile文件中
{
public static void main(String args[])
{
try
{
//构造读写的管道流对象
PipedInputStream pis=new PipedInputStream();
PipedOutputStream pos=new PipedOutputStream();
//实现关联
pos.connect(pis);
//构造两个线程,并且启动。
new Sender(pos,"c:\\text2.txt").start();
new Receiver(pis,"c:\\text3.txt").start();
}
catch(IOException e)
{
System.out.println("Pipe Error"+ e);
}
}
}
//线程发送
class Sender extends Thread
{
PipedOutputStream pos;
File file;
//构造方法
Sender(PipedOutputStream pos, String fileName)
{
this.pos=pos;
file=new File(fileName);
}
//线程运行方法
public void run()
{
try
{
//读文件内容
FileInputStream fs=new FileInputStream(file);
int data;
while((data=fs.read())!=-1)
{
//写入管道始端
pos.write(data);
}
pos.close();
}
catch(IOException e)
{
System.out.println("Sender Error" +e);
}
}
}
//线程读
class Receiver extends Thread
{
PipedInputStream pis;
File file;
//构造方法
Receiver(PipedInputStream pis, String fileName)
{
this.pis=pis;
file=new File(fileName);
}
//线程运行
public void run()
{
try
{
//写文件流对象
FileOutputStream fs=new FileOutputStream(file);
int data;
//从管道末端读
while((data=pis.read())!=-1)
{
//写入本地文件
fs.write(data);
}
pis.close();
}
catch(IOException e)
{
System.out.println("Receiver Error" +e);
}
}
}
http://www.cnblogs.com/jjtech/archive/2011/04/17/2019210.html点击打开链接
- 管道PipedInputStream/PipedOutputStream类
- 管道PipedInputStream/PipedOutputStream类
- 管道PipedInputStream/PipedOutputStream类应用
- Java管道 PipedInputStream PipedOutputStream
- 管道流PipedInputStream 和PipedOutputStream
- PipedInputStream和PipedOutputStream管道流
- PipedInputStream与PipedOutputStream类
- PipedInputStream and PipedOutputStream 实现管道通信
- Java IO--管道流PipedOutputStream/PipedInputStream
- java 管道流之PipedOutputStream和PipedInputStream
- 管道流PipedInputStream与PipedOutputStream操作实例
- PipedOutputStream和PipedInputStream管道实现线程通信
- PipedOutputStream类 和PipedInputStream 类
- Java-PipedOutputStream和PipedInputStream类
- PipedInputStream & PipedOutputStream
- PipedInputStream管道输出流和PipedOutputStream管道输入流
- 管道流PipedOutputStream和PipedInputStream的使用-黑马程序员
- java 管道流PipedOutputStream和PipedInputStream基本操作
- Zend Studio 使用 Xdebug 断点调试
- Win8刻录u盘教程图文详解
- sh和bash一些小差别
- 第五周项目二:分数类
- poj 2084 Game of Connections
- 管道PipedInputStream/PipedOutputStream类
- newlisp字符表示
- oracle笔记2
- 【我的应用系列】(二)自定义控件开发
- 金蝶BOS二次开发入门:常用类说明、代码调用过程
- HDU1710:Binary Tree Traversals
- Openwrt安装软件的方法
- 热泪盈眶...
- FS_S5PC100平台上Linux Camera驱动开发详解