java的NIO管道用法代码分享
作者:IT老蒋 发布时间:2022-05-01 23:52:53
标签:java,nio,管道
Java的NIO中的管道,就类似于实际中的管道,有两端,一段作为输入,一段作为输出。也就是说,在创建了一个管道后,既可以对管道进行写,也可以对管道进行读,不过这两种操作要分别在两端进行。有点类似于队列的方式。
这里是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);
}
我们在测试例子中给出一个非常简单的管道操作,先向管道写入内容,再从管道读出内容。
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());
}
}
}
输出结果
我们可以看到,已经可以完成我们需要的目标了。注意,我在这个地方编程的时候,出现了一点错误,就是我在读取管道的时候,没有设置getBuf.flip(),导致无法读出数据,这个函数非常重要,在完成buffer读取内容之后,一定要设置一下读标志,恢复指针到原始位置,才能读取到全部内容。
来源:http://blog.csdn.net/itbuluoge/article/details/39552769


猜你喜欢
- 本文实例讲述了C#中TreeView节点的自定义绘制方法。分享给大家供大家参考。具体如下:if ((e.State & TreeNo
- 前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷。在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除
- 学习内容Java I/O 项目案例内容管理java文件I/O实例----生成报表我们之前学习了两个重要的模块,一个就是Java I/O 另外
- 本文实例为大家分享了Android实现布局全屏的具体代码,供大家参考,具体内容如下前言类似Launcher,希望占用的布局铺满全屏,以调整状
- 样式如下所示:布局:layoutdialog_set_pwd.xml<?xml version="." encod
- 本文实例讲述了C#动态加载dll扩展系统功能的方法。分享给大家供大家参考。具体分析如下:动态加载dll,主要是为了扩展功能,增强灵活性而实现
- 本文实例讲述了Android编程之消息机制。分享给大家供大家参考,具体如下:一、角色描述1.Looper: 一个线程可以产生一个Looper
- 1.由json字符串转换成Map对象如json字符串:{"contend":[{"bid":&quo
- 今天没事跟群里面侃大山,有个哥们说道Android Wheel这个控件,以为是Andriod内置的控件,google一把,发现是个githu
- deque容器deque的相关文档deque与vector十分的相识。vector是单向开口的连续线性空间(单向扩容),deque则是一种双
- JDBC Statement对象实例以下是利用以下三种查询以及打开和关闭说明的例子:boolean execute(String SQL)
- Java 目前已经出到13的版本,但是国内大部分公司应该都停留在 Java 8 的版本(不敢承担升级带来的风险)。在Java8中给我们带来了
- 本篇文章会向大家实例讲述以下内容:将数组转换为List将List转换为数组将数组转换为Dictionary将Dictionary 转换为数组
- 查询数据会比较耗时,所以我们想把查询数据放在一个异步任务中,查询结果获得Cursor,然后在onPostExecute (Cursor re
- 面向对象编程(Object Oriented Programming)有三大特性:封装、继承、多态。在这里,和大家一起加深对三者的理解。封装
- 我就废话不多说了,大家还是直接看代码吧~package c10; import java.util.Scanner; public clas
- 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。例如:
- 本文实例讲述了C#实现的SQL备份与还原功能。分享给大家供大家参考,具体如下://记得加 folderBrowserDialog1 open
- 介绍备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获并保存一个对象的内部状态,并在之后可
- 引出泛型我们通过如下的示例,引出为什么泛型的概念。public class Test {public static void main(St