Java语言基础之管道流
2015-12-02 14:30
399 查看
管道流用于线程之间的通信。
PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道.PipedOutputStream可以向管道中写入数据,PipedIntputStream可以读取PipedOutputStream向管道中写入的数据.这两个类主要用来完成线程之间的通信.一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据.
一个线程的PipedInputStream对象从另外一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。
一共有两种方式实现管道流:
方法1 : 使用Connect进行连接
写入管道:
代码
import java.io.IOException;
import java.io.PipedOutputStream;
public class Producer extends Thread {
private PipedOutputStream pos;
public Producer(PipedOutputStream pos) {
this.pos = pos;
}
@Override
public void run() {
super.run();
try {
pos.write("Hello".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
从管道读出:
Main:
PipedStreamTest
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipedStreamTest {
public static void main(String[] args) {
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream();
try {
pos.connect(pis);// 连接管道
new Producer(pos).start();// 启动线程
new Consumer(pis).start();// 启动线程
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法2 : 是通过构造函数直接将某一个程序的输出作为另一个程序的输入,在定义对象时指明目标管道对象
Sender:
package Com.example.Pipe;
import java.io.IOException;
import java.io.PipedWriter;
public class Sender extends Thread {
private PipedWriter out =new PipedWriter();
public PipedWriter getPipedWriter()
{
return out;
}
public void run()
{
while(true)
{
for(char c='a';c<'z';c++){
try {
out.write(c);
sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Receiver:
package Com.example.Pipe;
import java.io.IOException;
import java.io.PipedReader;
public class Receiver extends Thread {
private PipedReader in;
public Receiver(Sender sender) throws IOException {
in = new PipedReader(sender.getPipedWriter());
}
public void run(){
try {
while(true)
{
System.out.println("read"+(char)in.read());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Main:
PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道.PipedOutputStream可以向管道中写入数据,PipedIntputStream可以读取PipedOutputStream向管道中写入的数据.这两个类主要用来完成线程之间的通信.一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据.
一个线程的PipedInputStream对象从另外一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。
一共有两种方式实现管道流:
方法1 : 使用Connect进行连接
写入管道:
代码
import java.io.IOException;
import java.io.PipedOutputStream;
public class Producer extends Thread {
private PipedOutputStream pos;
public Producer(PipedOutputStream pos) {
this.pos = pos;
}
@Override
public void run() {
super.run();
try {
pos.write("Hello".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
从管道读出:
代码 import java.io.IOException; import java.io.PipedInputStream; public class Consumer extends Thread { private PipedInputStream pis; public Consumer(PipedInputStream pis) { this.pis = pis; } @Override public void run() { super.run(); byte[] b = new byte[100]; // 将数据保存在byte数组中 try { int len = pis.read(b); // 从数组中得到实际大小。 System.out.println(new String(b, 0, len)); pis.close(); } catch (IOException e) { e.printStackTrace(); } } }
Main:
PipedStreamTest
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipedStreamTest {
public static void main(String[] args) {
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream();
try {
pos.connect(pis);// 连接管道
new Producer(pos).start();// 启动线程
new Consumer(pis).start();// 启动线程
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法2 : 是通过构造函数直接将某一个程序的输出作为另一个程序的输入,在定义对象时指明目标管道对象
Sender:
package Com.example.Pipe;
import java.io.IOException;
import java.io.PipedWriter;
public class Sender extends Thread {
private PipedWriter out =new PipedWriter();
public PipedWriter getPipedWriter()
{
return out;
}
public void run()
{
while(true)
{
for(char c='a';c<'z';c++){
try {
out.write(c);
sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Receiver:
package Com.example.Pipe;
import java.io.IOException;
import java.io.PipedReader;
public class Receiver extends Thread {
private PipedReader in;
public Receiver(Sender sender) throws IOException {
in = new PipedReader(sender.getPipedWriter());
}
public void run(){
try {
while(true)
{
System.out.println("read"+(char)in.read());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Main:
package Com.example.Pipe; import java.io.IOException; import java.io.PipedWriter; import java.util.Random; public class Main { public static void main(String[] args) throws IOException { Sender sender = new Sender(); Receiver receiver = new Receiver(sender); sender.start(); receiver.start(); } }
相关文章推荐
- 关于The function get must be used with a prefix when a default namespace is not specified的错误
- eclipse中把多个项目放在一个work set下
- Jackson处理java对象,json,xml间转换
- Java Log4J 使用教程(java日志)
- Spring源码阅读之Bean加载(xml)1
- java socket编程
- struts2的核心和工作原理
- 获取java项目根目录
- 在Eclipse中创建Maven多模块工程的例子[转载]
- java 使用zxing 生成二维码
- spring源码解析-Ioc1
- SCF架构开发:Maven+weblogic+eclipse开发总结
- SpringMVC整合Shiro
- Java Base64加密解密
- [论坛解答]java的&0xFF问题
- JAVA多线程实现的三种方式
- spring @Service()中初始化方法
- Eclipse SVN 创建分支
- spring 静态属性的注入技巧
- XStream xml转java对象