Java NIO系列教程(十一) Pipe

原文链接

  • 创建管道
  • 写入管道
  • 从管道中读取

Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。

这里是Pipe原理的图示:
在这里插入图片描述

创建管道

通过Pipe.open()方法打开管道。例如:

Pipe pipe = Pipe.open();
写入管道

要向管道写数据,需要访问sink通道。像这样:

Pipe.SinkChannel sinkChannel = pipe.sink();

通过调用SinkChannel的write()方法,将数据写入SinkChannel,像这样:

String newData = "New String to write to file..." + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());

buf.flip();

while(buf.hasRemaining()) {
    sinkChannel.write(buf);
}

从管道读取数据

从读取管道的数据,需要访问source通道,像这样:

Pipe.SourceChannel sourceChannel = pipe.source();

调用source通道的read()方法来读取数据,像这样:

ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = sourceChannel.read(buf);

read()方法返回的int值会告诉我们多少字节被读进了缓冲区。

完整案例:
	@Test
    public void testPipe() throws IOException {
        // 1、获取通道
        Pipe pipe = Pipe.open();

        // 2、获取sink管道,用来传送数据
        Pipe.SinkChannel sinkChannel = pipe.sink();

        // 3、申请一定大小的缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        byteBuffer.put("123232142345234".getBytes());
        byteBuffer.flip();

        // 4、sink发送数据
        sinkChannel.write(byteBuffer);

        // 5、创建接收pipe数据的source管道
        Pipe.SourceChannel sourceChannel = pipe.source();
        // 6、接收数据,并保存到缓冲区中
        ByteBuffer byteBuffer2 = ByteBuffer.allocate(1024);
        byteBuffer2.flip();
        int length = sourceChannel.read(byteBuffer2);

        System.out.println(new String(byteBuffer2.array(), 0, length));

        sourceChannel.close();
        sinkChannel.close();

    }

转载自并发编程网 – ifeve.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值