NIO Channel Scatter/Gather 管道Pipe类
通道提供了一种被称为Scatter/Gather的重要新功能(有时也被称为矢量I/O)。Scatter/Gather是一个简单却强大的概念,它是指在多个缓冲区上实现一个简单的I/O操作。对于一个write操作而言,数据是从几个缓冲区按顺序抽取(称为gather)并沿着通道发送的。缓冲区本身并不需要具备这种gather的能力(通常它们也没有此能力)。该gather过程的效果就好比全部缓冲区的内容被连结起来,并在发送数据前存放到一个大的缓冲区中。对于read操作而言,从通道读取的数据会按顺序被散布(称为scatter)到多个缓冲区,将每个缓冲区填满直至通道中的数据或者缓冲区的最大空间被消耗完。
支持Scatter/Gather操作的Channel都实现了对应的Scatter/GatherChannel接口:
两个带带offset和length参数版本的read( ) 和write( )方法使得我们可以使用缓冲区阵列的子集缓冲区
两个接口提供的核心功能为对Buffer[]读写的能力,当在一个通道上请求一个Scatter/Gather操作时,该请求会被翻译为适当的本地调用来直接填充或抽取缓冲区。这是一个很大的进步,因为减少或避免了缓冲区拷贝和系统调用。Scatter/Gather应该使用直接的ByteBuffers以从本地I/O获取最大性能优势。使用得当的话,Scatter/Gather会是一个极其强大的工具。它允许您委托操作系统来完成辛苦活:将读取到的数据分开存放到多个存储桶(bucket)或者将不同的数据区块合并成一个整体。这是一个巨大的成就,因为操作系统已经被高度优化来完成此类工作了。它节省了您来回移动数据的工作,也就避免了缓冲区拷贝和减少了您需要编写、调试的代码数量。既然您基本上通过提供数据容器引用来组合数据,那么按照不同的组合构建多个缓冲区阵列引用,各种数据区块就可以以不同的方式来组合了(尤其是针对read操作)。
对应示例代码如下:
/*** 矢量操作* @throws Exception*/@Testpublic void scatteringChannelTest() throws Exception {Pipe pipe = Pipe.open();ByteBuffer[] buffers = NIOUtils.getByteBuffers("hello","world");pipe.sink().write(buffers);ByteBuffer readbuffer = ByteBuffer.allocate(100);pipe.source().read(readbuffer);ByteBuffer[] buffers2 = NIOUtils.getByteBuffers("hello","world","hello");pipe.sink().write(buffers2);ByteBuffer[] readbuffers = NIOUtils.getReadableByteBuffers(2);pipe.source().read(readbuffers);System.out.println("end-----------------------");}
管道 Pipe:
上面的代码中还用到了Pipe类,Pipe类创建一对提供环回机制的Channel对象。这两个通道的远端是连接起来的,以便任何写在SinkChannel对象上的数据都能出现在SourceChannel对象上。Pipe实例是通过调用不带参数的Pipe.open( )工厂方法来创建的。Pipe类定义了两个嵌套的通道类来实现管路。这两个类是Pipe.SourceChannel(管道负责读的一端)和Pipe.SinkChannel(管道负责写的一端)。这两个通道实例是在Pipe对象创建的同时被创建的,可以通过在Pipe对象上分别调用source( )和sink( )方法来取回。
管道可以被用来仅在同一个Java虚拟机内部传输数据。虽然有更加有效率的方式来在线程之间传输数据,但是使用管道的好处在于封装性。生产者线程和用户线程都能被写道通用的Channel API中。根据给定的通道类型,相同的代码可以被用来写数据到一个文件、socket或管道。选择器可以被用来检查管道上的数据可用性,如同在socket通道上使用那样地简单。这样就可以允许单个用户线程使用一个Selector来从多个通道有效地收集数据,并可任意结合网络连接或本地工作线程使用。因此,这些对于可伸缩性、冗余度以及可复用性来说无疑都是意义重大的。
Pipes的另一个有用之处是可以用来辅助测试。一个单元测试框架可以将某个待测试的类连接到管道的“写”端并检查管道的“读”端出来的数据。它也可以将被测试的类置于通道的“读”端并将受控的测试数据写进其中。两种场景对于回归测试都是很有帮助的。
转载于:https://www.cnblogs.com/heapStark/p/8175969.html
NIO Channel Scatter/Gather 管道Pipe类相关推荐
- 【Java NIO的深入研究6】JAVA NIO之Scatter/Gather
Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作. 分散(s ...
- Java NIO (五) 管道 (Pipe)
Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 如下图: 向管道写数据: 从管道读数据: 1. ...
- NIO - Scatter/Gather
1.Scatter 从一个Channel读取的信息分散到N个缓冲区中(Buufer). 2.Gather 将N个Buffer里面内容按照顺序发送到一个Channel. Scatter/Gather ...
- JavaNIO - Scatter Gather
Scatter & Gather指在多个缓冲区上实现一个简单的 I/O 操作.减少或避免了Buffer间的拷贝和系统调用. Channel Write操作 Write操作 Channel Re ...
- Java NIO系列教程(四) Scatter/Gather
转载自 Java NIO系列教程(四) Scatter/Gather 译文地址 作者:Jakob Jenkov 译者:郭蕾 Java NIO开始支持scatter/gather,scatte ...
- java nio 系列教程 四_Java NIO系列教程(四) Scatter/Gather
作者:Jakob Jenkov 译者:郭蕾 Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道) ...
- 二、Java NIO Channel
一.Java NIO 网络编程 二.Java NIO Channel 三.Java NIO Buffer 四.Java NIO Selector 五.Java NIO 扩展组件 一.Channel 概 ...
- NIO与Socket笔记 :Selector 类的使用
Selector类的主要作用是作为 SelectableChannel对象的多路复用器. 可通过调用 Selector类的 open()方法创建选择器,该方法将使用系统的默认 Selector Pr ...
- 反射 Nio channel Buffer
1.反射 1.反射的简介 java的反射机制 在运行状态中 对于任意一个类 都能知道任意一个类的所有属性和方法 对于任意一个对象 都能够调用它的任意一个属性和方 ...
- [转]Angular2 使用管道Pipe以及自定义管道格式数据
本文转自:https://www.pocketdigi.com/20170209/1563.html 管道(Pipe)可以根据开发者的意愿将数据格式化,还可以多个管道串联. 纯管道(Pure Pipe ...
最新文章
- SAP Spartacus checkout.reducer.ts调用时间点
- 子类重写父类变量_为什么在子类中不重写超类的实例变量
- array.unshift_Ruby中带有示例的Array.unshift()方法
- 一个完整的c语言的单链表代码,单链表完整C语言纯代码.docx
- 【BZOJ4668】冷战 并查集
- 程序员的职业选择,你应该知道的,持续更新ing
- Unity面试题精选(7)
- MySQL_PHP学习笔记_2015_0614_PHP传参总结_URL传参_表单传参
- GitHub实现G D O S自动签到
- android studio for android learning (十六) support-annotations简介
- 单片机控制点阵字符显示及字模提取原理
- 2_PY基本数据类型
- 正确开启用户实体行为分析(UEBA)番外篇:SIEM与UEBA
- php订阅号怎么借服务号权限,微信订阅号已经认证能否有网页授权功能
- 2023年全国最新工会考试精选真题及答案41
- 算法原理系列:红黑树
- 从营收提升到品牌资产增长,私域时代的购物节跃迁
- 解决edge浏览器无法打开pdf文件问题
- 投稿经验分享之四:SCI投稿之JEI录用
- 商城电商day 06 三、商品详情业务需求分析