当前位置: 首页 > 编程日记 > 正文

NIO - Scatter/Gather

1.Scatter  从一个Channel读取的信息分散到N个缓冲区中(Buufer).

2.Gather  将N个Buffer里面内容按照顺序发送到一个Channel.

Scatter/Gather功能是通道(Channel)提供的  并不是Buffer,

Scatter/Gather相关接口 类图

ReadableByteChannel WritableByteChannel     接口提供了通道的读写功能

ScatteringByteChannel  GatheringByteChannel接口都新增了两个以缓冲区数组作为参数的相应方法

以FileChannel为例

*Scatter

        /*** Scatter* <br>------------------------------<br>* @param fileName* @throws IOException* @see FileChannel.read(java.nio.ByteBuffer[])*/private static void scatter(final String fileName) throws IOException {RandomAccessFile accessFile = new RandomAccessFile(fileName, "r");//获取文件通道FileChannel channel = accessFile.getChannel();//创建两个缓冲区ByteBuffer headBuffer = ByteBuffer.allocate(2);ByteBuffer bodyBuffer = ByteBuffer.allocate(1024);ByteBuffer[] allBuffers = new ByteBuffer[]{headBuffer, bodyBuffer};// headBuffer 前10个字节// bodyBuffer 剩下的 long n = channel.read(allBuffers);System.out.println("共读到多少字节:" + n);headBuffer.flip();//head缓冲区中的数据:qwSystem.out.println("head缓冲区中的数据:" + charset.decode(headBuffer));bodyBuffer.flip();//body缓冲区中的数据:ertyuiopSystem.out.println("body缓冲区中的数据:" + charset.decode(bodyBuffer));accessFile.close();channel.close();}/*** Scatter2* <br>------------------------------<br>* @param fileName* @throws IOException* @see FileChannel.read(java.nio.ByteBuffer[], int, int)*/private static void scatter2(final String fileName) throws IOException {RandomAccessFile accessFile = new RandomAccessFile(fileName, "r");//获取文件通道FileChannel channel = accessFile.getChannel();//创建五个缓冲区ByteBuffer headBuffer = ByteBuffer.allocate(2);ByteBuffer bodyBuffer1 = ByteBuffer.allocate(3);ByteBuffer bodyBuffer2 = ByteBuffer.allocate(2);ByteBuffer bodyBuffer3 = ByteBuffer.allocate(2);ByteBuffer bodyBuffer4 = ByteBuffer.allocate(1);ByteBuffer[] allBuffers = new ByteBuffer[]{headBuffer, bodyBuffer1, bodyBuffer2,bodyBuffer3, bodyBuffer4,};//0从那个缓冲区开始被使用    使用3个缓冲区//会使用 headBuffer,bodyBuffer1,bodyBuffer2long n = channel.read(allBuffers, 0, 3);System.out.println("共读到多少字节:" + n);headBuffer.flip();//head缓冲区中的数据:qwSystem.out.println("head缓冲区中的数据:" + charset.decode(headBuffer));bodyBuffer1.flip();//body1缓冲区中的数据:ertSystem.out.println("body1缓冲区中的数据:" + charset.decode(bodyBuffer1));bodyBuffer2.flip();//body2缓冲区中的数据:yuSystem.out.println("body2缓冲区中的数据:" + charset.decode(bodyBuffer2));bodyBuffer3.flip();//body3,没有数据System.out.println("body3缓冲区中的数据:" + charset.decode(bodyBuffer3));bodyBuffer4.flip();//body4没有数据System.out.println("body4缓冲区中的数据:" + charset.decode(bodyBuffer4));accessFile.close();channel.close();}/**** <br>------------------------------<br>* @param fileName* @throws IOException*/private static void writeData(final String fileName, String data) throws IOException {RandomAccessFile accessFile = new RandomAccessFile(fileName, "rw");accessFile.writeBytes(data);accessFile.close();}
	private static Charset charset = Charset.forName("GBK");public static void main(String[] args) throws IOException {final String fileName = "D:/test.log";//先写入10个字节数据 以便测试 scatter模式writeData(fileName, "qwertyuiop");/**----------Scatter------------*///read(java.nio.ByteBuffer[])scatter(fileName);//read(java.nio.ByteBuffer[], int, int)scatter2(fileName);}

*Gather

	/*** gather* <br>------------------------------<br>* @param fileName* @throws IOException * @see FileChannel#write(java.nio.ByteBuffer[])*/private static void gather(String fileName) throws IOException {RandomAccessFile accessFile = new RandomAccessFile(fileName, "rw");//获取文件通道FileChannel channel = accessFile.getChannel();//创建两个缓冲区ByteBuffer headBuffer = ByteBuffer.allocate(3);headBuffer.put("abc".getBytes());ByteBuffer bodyBuffer = ByteBuffer.allocate(1024);bodyBuffer.put("defg".getBytes());ByteBuffer[] allBuffers = new ByteBuffer[]{headBuffer, bodyBuffer};headBuffer.flip();bodyBuffer.flip();//将按allBuffers顺序  写入abcdefglong n = channel.write(allBuffers);System.out.println("共写入多少字节:" + n);accessFile.close();channel.close();}/*** gather2* <br>------------------------------<br>* @param fileName* @throws IOException * @see FileChannel#write(java.nio.ByteBuffer[], int, int)*/private static void gather2(String fileName) throws IOException {RandomAccessFile accessFile = new RandomAccessFile(fileName, "rw");//获取文件通道FileChannel channel = accessFile.getChannel();//创建两个缓冲区ByteBuffer headBuffer = ByteBuffer.allocate(3);ByteBuffer bodyBuffer1 = ByteBuffer.allocate(4);ByteBuffer bodyBuffer2 = ByteBuffer.allocate(20);ByteBuffer bodyBuffer3 = ByteBuffer.allocate(20);ByteBuffer bodyBuffer4 = ByteBuffer.allocate(20);headBuffer.put("abc".getBytes());bodyBuffer1.put("defg".getBytes());bodyBuffer2.put("bnbnbnb".getBytes());bodyBuffer3.put("zzz444".getBytes());ByteBuffer[] allBuffers = new ByteBuffer[]{headBuffer, bodyBuffer1, bodyBuffer2,bodyBuffer3, bodyBuffer4,};headBuffer.flip();bodyBuffer1.flip();bodyBuffer2.flip();bodyBuffer3.flip();bodyBuffer4.flip();//将按allBuffers数组顺序使用两个缓冲区//0从哪开始//2使用几个//当前使用headBuffer  bodyBuffer1//最终写入abcdefglong n = channel.write(allBuffers, 0, 2);//应该返回7个字节System.out.println("共写入多少字节:" + n);accessFile.close();channel.close();}
	private static Charset charset = Charset.forName("GBK");public static void main(String[] args) throws IOException {final String fileName = "D:/test.log";/**----------Gather------------*///FileChannel#write(java.nio.ByteBuffer[])gather(fileName);//FileChannel#write(java.nio.ByteBuffer[], int, int)gather2(fileName);}

转载于:https://www.cnblogs.com/yangjin-55/archive/2012/05/31/2786538.html

相关文章:

android:themes.xml

按 CtrlC 复制代码按 CtrlC 复制代码本文转自 OldHawk 博客园博客&#xff0c;原文链接&#xff1a;http://www.cnblogs.com/taobataoma/p/3761520.html&#xff0c;如需转载请自行联系原作者

参考答案:01 线性方程组

本篇图文为《线性代数及其应用》这本教材对应习题册的参考答案。 从本章开始&#xff0c;我们一起来学习线性代数的有关知识&#xff0c;线性代数的应用之一就是求解复杂方程问题。所以&#xff0c;我们首先从高中时期利用高斯消元法求解线性方程组谈起&#xff0c;发现可以利…

Java培训都学什么

java行业的快速发展&#xff0c;引起了很多人的关注&#xff0c;越来越多的人选择报java培训机构学习java技术&#xff0c;那么Java培训都学什么呢?零基础的同学是否能学会呢?来看看下面的详细介绍。 Java培训都学什么?主要分为以下几个阶段&#xff1a; 第一阶段&#xff1…

网站架构之统一数据服务平台技术

一、论坛背景 新一代网站架构的使命&#xff0c;敏捷&#xff0c;开发&#xff0c;体验。 敏捷&#xff1a;业务快速增长,每天都要上线大量的小需求,应用系统日益膨胀,耦合恶化&#xff0c;架构越来越复杂,带来更高的开发成本。如何保持业务开发敏捷性? 开放&#xff1a;Faceb…

Oracle 变量绑定与变量窥视合集系列二

二 用示例演示一次硬分析&#xff08;hard parse)和一次软分析&#xff08;soft parse&#xff09;&#xff0c;以及一次更软的分析&#xff08;softer soft parse)&#xff0c;并对给出演示结果 我们先看一个硬解析和软解析关系测试&#xff0c;什么时候硬解析&#xff0c;什么…

参考答案:02 矩阵及其运算

本篇图文为《线性代数及其应用》这本教材对应习题册的参考答案。 本章主要介绍有关矩阵的知识&#xff0c;主要包括矩阵的基本运算&#xff08;加法、数乘、乘法、乘幂、迹、转置&#xff09;&#xff0c;其中乘法最为重要&#xff0c;在计算机图形学中具有大量的应用。如果矩…

web前端培训:本期教程CSS 三大特性

CSS 有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级&#xff1a; 1. 层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突的问题。 层叠性原则&#xff1a; 样式冲突&#xff0c;遵循的原则是就近…

如何在Terminal命令行模式下运行Objective-C

一般Objective-C的代码都在Xcode中调试&#xff0c;今天实验了下如何在命令行模式下运行&#xff0c;还是比较简单的&#xff0c;记录分享一下。 File: xxd.h #include <Foundation/Foundation.h> interface Xxd: NSObject { } - (void) xxdSayHelloTo: (NSString *)name…

人工智能时代,程序员要不要精通算法?

1.如何入门算法&#xff1f;需要学习哪些基础知识&#xff0c;请分享你的经验与建议。 入门算法其实很简单&#xff0c;拿生活中的很多现实问题来解决就可以了。比如商场打折问题&#xff08;是打折划算还是满减划算&#xff09;&#xff0c;百钱买百鸡、猴子分桃、鸡兔同笼等有…

参考答案:03 向量空间

本篇图文为《线性代数及其应用》这本教材对应习题册的参考答案。 本章主要介绍向量空间的知识&#xff0c;与前两章一样本章也可以通过研究解线性方程组的解把所有知识点串联起来&#xff0c;比如研究齐次线性方程组的解可以得到线性相关、线性无关、零空间、解空间的基&#…

Java3大框架的学习都是什么

java是互联网行业的第一编程语言&#xff0c;相信大家都已经有了解了&#xff0c;事实也确实如此&#xff0c;java还是世界第一编程语言&#xff0c;在java培训学习的过程中&#xff0c;框架是程序员们必学的知识点&#xff0c;而且是十分重要的应用&#xff0c;Spring、Struts…

百万数据修改索引,百万数据修改主键

当百万数据时&#xff0c;如果修改主键&#xff0c;那么会自动重建索引&#xff0c;所以操作会非常慢&#xff0c;经常会超时&#xff0c;错误提示类似&#xff1a;超时时间已到。在操作完成之前超时时间已过或服务器未响应解决方案&#xff1a;不要采用手动添加主键或者索引&a…

参考答案:05 实对称矩阵与二次型

本篇图文为《线性代数及其应用》这本教材对应习题册的参考答案。 本章是特征值与特征向量知识的延续&#xff0c;根据谱定理可知实对称矩阵可以正交对角化&#xff0c;对角阵为其特征值&#xff0c;正交矩阵为其两两正交的单位特征向量。除此之外&#xff0c;还介绍了二次型&a…

会话保持之iRule脚本

拓扑 思路: Web上的请求&#xff0c;很大程度上需要在后端一台服务器上运行&#xff0c;而不能将请求1,与请求2分别在不同的真实机上。所以&#xff0c;就需要使用会话保持技术了。F5的会话保持有内置的&#xff0c;如简单会话保持&#xff0c;就是根据客户端ip地址而更新会话表…

pmp考试标准有哪些?

pmp认证在互联网行业近几年广受企业的关注&#xff0c;越来越多的职场人员都想参加pmp培训认证&#xff0c;那么pmp考试标准有哪些?学历标准又是怎样的?来看看下面详细的介绍吧。 pmp考试标准有哪些?首先报名参加PMP培训认证对文凭并没有规定&#xff0c;无论文凭好坏&#…

【经验】【ORACLE】从字符串中截取其中的数字

方法一&#xff1a;如果Oracle版本不是太低的话&#xff0c;使用 正则表达式函数 REGEXP_SUBSTR 处理。 REGEXP_SUBSTR有5个参数&#xff0c;分别是&#xff1a; 第一个是输入的字符串 第二个是正则表达式 第三个是标识从第几个字符开始正则表达式匹配。&#xff08;默认为1&am…

为什么结构主机和全局编录服务器不能放在同一个域控制器上?

”注意&#xff1a;结构主机 (IM) 角色应由非全局编录 (GC) 服务器的域控制器担任。如果结构主机在全局编录服务器上运行&#xff0c;它将会停止更新对象信息&#xff0c;原因是它只包含对它所拥有的对象的引用。“我有个疑问&#xff1a;在装域控制的时候&#xff0c;第一个装…

题目 1083:【蓝桥杯】【入门题】Hello, world!

题目 1083&#xff1a;Hello, world! 蓝桥杯刷题群已成立&#xff0c;微信后台回复【蓝桥杯】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 64MB 1. 题目描述 这是要测试的第一个问题。由于我们都知道ASCII码&#xff0c;因此您的…

软件测试培训教程:pytest与unittest区别

在软件测试培训教程中&#xff0c;会讲到关于pytest与unittest区别&#xff0c;那么本期教程小编就为大家详细的介绍一下pytest与unittest区别有哪些? pytest与unittest区别&#xff1a; 一、用例编写规则 1.unittest提供了testcases、testsuites、testfixtures、testrunner相…

NA-NP-IE系列实验36:扩展ACL

实验36&#xff1a;扩展ACL1.实验目的 通过本实验可以掌握&#xff1a;&#xff08;1&#xff09;定义扩展ACL&#xff08;2&#xff09;应用扩展ACL&#xff08;3&#xff09;扩展ACL 调试2.拓扑结构 实验拓扑如图所示。3.实验步骤 注&#xff1a;本实验要求不允许1.1.1.1 所在…

题目 1470:【蓝桥杯】【入门题】【基础练习VIP】时间转换

题目 1470&#xff1a;时间转换 蓝桥杯刷题群已成立&#xff0c;微信后台回复【蓝桥杯】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 给定一个以秒为单位的时间t&#xff0c;要求用 “< H> :< M> …

Android如何防止apk程序被反编译

作为Android应用开发者&#xff0c;不得不面对一个尴尬的局面&#xff0c;就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。Google似乎也发现了这个问题&#xff0c;从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了一个proguard文件夹 proguard是一…

java培训:什么是抽象类?怎么定义?

什么是抽象类?怎么定义?这是属于java技术里面的一个知识点&#xff0c;本期教程就是围绕这个问题做的相关介绍&#xff0c;当定义一个类时&#xff0c;常常需要定义一些成员方法描述类的行为特征&#xff0c;但有时这些方法的实现方式是无法确定的。例如&#xff0c;在定义An…

题目 1093:【蓝桥杯】【入门题】字符逆序

题目 1093&#xff1a;字符逆序 蓝桥杯刷题群已成立&#xff0c;微信后台回复【蓝桥杯】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 64MB 1. 题目描述 将一个字符串str的内容颠倒过来&#xff0c;并输出。str的长度不超过100个字…

一款腾讯UED设计的提示插件(使用教程)

这是一款腾讯UED设计的提示插件&#xff0c;看着肯定很眼熟吧&#xff0c;闲话不多说&#xff0c;直接上demo吧。 显示 ZENG.msgbox.show(提示信息,图标类型);隐藏&#xff1a; ZENG.msgbox._hide();几秒后自动隐藏&#xff1a; ZENG.msgbox.show(提示信息,图标类型,显示时长);…

互联网企业的移动布局

转载于:https://www.cnblogs.com/deve/archive/2012/06/13/2568988.html

女生学软件测试有哪些优势

对于软件测试这个岗位&#xff0c;相信大家都有听说过&#xff0c;最近几年&#xff0c;越来越多的女性加入到互联网技术行业&#xff0c;选择最多的岗位就是软件测试&#xff0c;那么到底女生学软件测试有哪些优势呢?来看看下面的详细介绍。 女生学软件测试有哪些优势?首先咱…

常见http状态码说明(转)

首先要先了解下什么是HTTP状态码&#xff1a;HTTP状态码&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器HTTP响应状态的3位数字代码。每当客户端向Web服务器发送一个HTTP请求时&#xff0c;服务器都会返回一个响应代码。而这些响应代码主要分成五类&#xff1a;…

题目 1471:【蓝桥杯】【入门题】【基础练习VIP】矩形面积交

题目 1471&#xff1a;矩形面积交 蓝桥杯刷题群已成立&#xff0c;微信后台回复【蓝桥杯】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 平面上有两个矩形&#xff0c;它们的边平行于直角坐标系的X轴或Y轴。对于…

Windows Server 2012关闭Server Manager开机自启动

最近将办公系统改为了Windows Server 2012使用起来个人感觉比较方便&#xff0c;且对服务器管理也变得更加方便&#xff0c;但是用做办公我又不喜欢Server Manager每次开机都启动&#xff0c;当然如果是生产用的服务器还是应该开启的&#xff0c;这样可以在这里直观看到当前服务…