java的NIO管道用法代码分享

作者:IT老蒋 时间:2022-05-01 23:52:53 

Java的NIO中的管道,就类似于实际中的管道,有两端,一段作为输入,一段作为输出。也就是说,在创建了一个管道后,既可以对管道进行写,也可以对管道进行读,不过这两种操作要分别在两端进行。有点类似于队列的方式。

这里是Pipe原理的图示:

java的NIO管道用法代码分享

创建管道

通过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);
}

我们在测试例子中给出一个非常简单的管道操作,先向管道写入内容,再从管道读出内容。

 


package com.test.nio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
public class TestPipeA {
/**
  * @param args
  * @throws Exception
  */
public static void main(String[] args) throws Exception {
//创建一个管道
Pipe pipe=Pipe.open();
//创建一个写管道
Pipe.SinkChannel sinkChannel=pipe.sink();
String newData="itbuluoge.com says:"+System.currentTimeMillis();
ByteBuffer buf=ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
/*向管道写入内容*/
while(buf.hasRemaining())
   {
sinkChannel.write(buf);
}
/*创建一个读管道*/
Pipe.SourceChannel sourceChannel=pipe.source();
ByteBuffer getBuf=ByteBuffer.allocate(48);
int bytesRead=sourceChannel.read(getBuf);
getBuf.flip();
/*从管道读出内容*/
while(getBuf.hasRemaining())
   {
System.out.print((char)getBuf.get());
}
}
}

输出结果

java的NIO管道用法代码分享

我们可以看到,已经可以完成我们需要的目标了。注意,我在这个地方编程的时候,出现了一点错误,就是我在读取管道的时候,没有设置getBuf.flip(),导致无法读出数据,这个函数非常重要,在完成buffer读取内容之后,一定要设置一下读标志,恢复指针到原始位置,才能读取到全部内容。

来源:http://blog.csdn.net/itbuluoge/article/details/39552769

标签:java,nio,管道
0
投稿

猜你喜欢

  • 安卓GreenDao框架一些进阶用法整理

    2023-06-17 03:27:21
  • JMeter中的后端监听器的实现

    2022-07-24 17:58:35
  • 浅析C++中的函数与指针

    2022-03-13 11:04:28
  • Flutter持久化存储之数据库存储(sqflite)详解

    2022-11-16 04:34:30
  • Java 代理(Proxy)的原理及应用

    2023-08-21 08:40:41
  • JAVA语言编程格式高级规范

    2021-08-21 01:43:54
  • 如何使用Java调用Linux系统命令

    2021-12-24 20:45:31
  • c#在控制台输出彩色文字的方法

    2021-07-17 03:46:51
  • springboot整合mybatis将sql打印到日志的实例详解

    2022-06-15 00:56:06
  • C#设置MDI子窗体只能弹出一个的方法

    2022-03-19 23:40:11
  • Android中实现EditText圆角的方法

    2023-10-11 20:53:52
  • 详解Spring中的FactoryBean

    2022-06-08 05:29:55
  • Spring中的事务隔离级别和传播行为

    2022-07-21 18:18:24
  • C#编程获取各种电脑硬件信息的方法示例

    2022-09-17 09:38:39
  • Winform圆形环绕的Loading动画实现代码

    2023-09-09 00:13:47
  • Java如何实现Word文档分栏效果

    2023-09-11 00:28:53
  • VS2019配置OpenCV4.1.0详细教程与测试代码(推荐)

    2021-11-06 21:55:24
  • list集合去除重复对象的实现

    2022-10-16 23:02:42
  • Android获得所有存储设备位置的最佳方法

    2022-06-27 21:08:51
  • Spring Boot实现Undertow服务器同时支持HTTP2、HTTPS的方法

    2021-09-23 17:02:30
  • asp之家 软件编程 m.aspxhome.com