java管道通信

Java提供管道功能,实现管道通信的类有两组:PipedInputStream和PipedOutputStream或者是PipedReader和PipedWriter。管道通信主要用于不同线程间的通信。

一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道。PipedOutputStream向管道中写入数据,PipedIntputStream读取PipedOutputStream向管道中写入的数据。一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据。

PipedInputStream和PipedOutputStream实例

//Sender类

package pipeCommu;

import java.io.PipedInputStream;

import java.io.PipedOutputStream;

public class Sender extends Thread{

private PipedOutputStream out=new PipedOutputStream();//发送者创建PipedOutputStream向外写数据;

public PipedOutputStream getOut(){

return out;

}

public void run(){

String strInfo="hello,receiver";

try{

out.write(strInfo.getBytes());//写入数据

out.close();

}catch(Exception e){

e.printStackTrace();

}

}

}

//Reader类,负责接收数据

package pipeCommu;

import java.io.PipedInputStream;

public class Reader extends Thread{

private PipedInputStream in=new PipedInputStream();//发送者创建PipedOutputStream向外写数据

public PipedInputStream getIn(){

return in;

}

public void run(){

byte[] buf=new byte[1024];//声明字节数组

try{

int len=in.read(buf);//读取数据,并返回实际读到的字节数

System.out.println("receive from sender:"+new String(buf,0,len));

in.close();

}catch(Exception e){

e.printStackTrace();

}

}

}
package pipeCommu;

import java.io.*;

public class PipedStream {

public static void main(String[] args) throws Exception{

Sender send=new Sender();

Reader read=new Reader();

PipedOutputStream out=send.getOut();

PipedInputStream in=read.getIn();

out.connect(in);//或者也可以用in.connect(out);

send.start();

read.start();

}

}


PipedReader和PipedWriter

package pipeCommu;

import java.io.*;

public class PipedCommu {

public static void main(String[] args) {

// TODO Auto-generated method stub

try{

PipedReader reader=new PipedReader();

PipedWriter writer=new PipedWriter(reader);

Thread a=new Send(writer);

Thread b=new Read(reader);

a.start();

Thread.sleep(1000);

b.start();

}catch(IOException e){

e.printStackTrace();

}catch(InterruptedException e1){

e1.printStackTrace();

}

}

}

class Send extends Thread{

PipedWriter writer;

public Send(PipedWriter writer){

this.writer=writer;

}

public void run(){

try{

writer.write("this is a.hello world".toCharArray());

writer.close();

}catch(IOException e){

e.printStackTrace();

}

}

}

class Read extends Thread{

PipedReader reader;

public Read(PipedReader reader){

this.reader=reader;

}

public void run(){

System.out.println("this is B");

try{

char[] buf=new char[1000];

reader.read(buf,0,100);

System.out.println(new String(buf));

}catch(Exception e){

e.printStackTrace();

}

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java管道流是一种特殊的I/O流,它允许两个线程之间进行单向通信。一个线程可以将数据写入管道流,另一个线程可以从管道流读取数据。Java管道流通过一个管道输入流和一个管道输出流来实现。 以下是Java管道流的基本操作: 1. 创建管道:使用Pipe类的静态方法open()创建管道,该方法返回一个Pipe对象,其包含管道输入流和管道输出流。 ``` Pipe pipe = Pipe.open(); ``` 2. 获取管道输入流和输出流:使用Pipe对象的方法获取管道输入流和输出流。 ``` Pipe.SourceChannel sourceChannel = pipe.source(); Pipe.SinkChannel sinkChannel = pipe.sink(); ``` 3. 向管道输出流写入数据:使用管道输出流的write()方法向管道写入数据。 ``` sinkChannel.write(ByteBuffer.wrap("Hello, World!".getBytes())); ``` 4. 从管道输入流读取数据:使用管道输入流的read()方法从管道读取数据。 ``` ByteBuffer buffer = ByteBuffer.allocate(1024); sourceChannel.read(buffer); ``` 完整的Java管道流示例: ``` import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; public class PipeExample { public static void main(String[] args) throws IOException { // 创建管道 Pipe pipe = Pipe.open(); // 获取管道输入流和输出流 Pipe.SourceChannel sourceChannel = pipe.source(); Pipe.SinkChannel sinkChannel = pipe.sink(); // 向管道输出流写入数据 sinkChannel.write(ByteBuffer.wrap("Hello, World!".getBytes())); // 从管道输入流读取数据 ByteBuffer buffer = ByteBuffer.allocate(1024); sourceChannel.read(buffer); System.out.println(new String(buffer.array()).trim()); } } ``` 运行结果: ``` Hello, World! ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值