JAVA NIO Scatter/Gather(矢量IO)
时间:2022-07-24
本文章向大家介绍JAVA NIO Scatter/Gather(矢量IO),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
矢量IO=Scatter/Gather:
在多个缓冲区上实现一个简单的IO操作。减少或避免了缓冲区拷贝和系统调用(IO)
write:Gather
数据从几个缓冲区顺序抽取并沿着通道发送,就好比全部缓冲区全部连接起来放入一个大的缓冲区进行发送,缓冲区本身不具备gather能力。
read:Scatter
从通道读取的数据会按顺序散布到多个缓冲区,直到缓冲区被填满或者通道数据读完。
Gather:
Scatter:
示例代码:
/**
* channel Gather/Scatter
*/
public static void channelGatherScatter(){
ByteBuffer head = ByteBuffer.allocate(4);
ByteBuffer body = ByteBuffer.allocate(100);
RandomAccessFile afile = null;
RandomAccessFile bfile = null;
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
try {
afile = new RandomAccessFile("hello.txt", "r");
bfile = new RandomAccessFile("hehe.txt", "rw");
readWriteLock.readLock().lock();
FileChannel fileChannel = afile.getChannel();
ByteBuffer[] buffers = {head, body};
while (fileChannel.read(buffers) != -1){
}
head.flip();
body.flip();
System.out.println(new String(head.array()));
System.out.println(new String(body.array()));
readWriteLock.readLock().unlock();
fileChannel.close();
afile.close();
readWriteLock.writeLock().lock();
FileChannel bfileChannel = bfile.getChannel();
while (bfileChannel.write(buffers) > 0){
}
readWriteLock.writeLock().unlock();
bfileChannel.close();
bfile.close();
}catch (Exception e){
e.printStackTrace();
}
}
带offset、length参数重载read write方法,指明从那个buffer开始,共使用多少个buffer。
- [LeetCode]String主题系列{第5,6题}
- CDH内存调拨过度警告分析
- Ztorg:从 root 到 SMS
- [LeetCode]Math主题系列{第7,9,13,273题}
- 被忽视的攻击面:Python package 钓鱼
- [LeetCode]LinkedList主题系列{第2题}
- [LeetCode]HashTable主题系列{第3题}
- 如何使用Oozie API接口向Kerberos集群提交Java程序
- [LeetCode]Array主题系列{35,39,40,48题}
- 如何使用Sqoop2
- [LeetCode]Array主题系列{1,11,15,16,18,26,27,31,33,34题}
- Bwapp漏洞平台答案全解-A1(第三篇)
- pom.xml配置文件中所有标签及作用简单描述
- 关于C#获取动态的时间差函数
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- laravel 出现command not found问题的解决方案
- PHP怎么搭建百度Ueditor富文本编辑器
- 使用composer命令加载vendor中的第三方类库 的方法
- PHP批斗大会之缺失的异常详解
- Laravel 6.2 中添加了可调用容器对象的方法
- php实现微信企业转账功能
- 在 Laravel 6 中缓存数据库查询结果的方法
- PHP操作XML中XPath的应用示例
- Laravel手动返回错误码示例
- laravel添加前台跳转成功页面示例
- PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
- thinkPHP利用ajax异步上传图片并显示、删除的示例
- Yii框架where查询用法实例分析
- PHP命名空间(namespace)原理与用法详解
- Laravel 在views中加载公共页面的实现代码