Java NIO学习笔记 三 散点/收集 和频道转换
Java NIO散点/收集
Java NIO带有内置的分散/收集支持。散点/收集是读取和写入渠道过程中使用的概念。
从通道散射读取是将数据读入多个缓冲区的读取操作。因此,数据可以从通道“散布”到多个缓冲器中。
对通道进行收集写入是将数据从多个缓冲区写入单个通道的写入操作。因此,数据可以从多个缓冲器收集到一个通道中。
在需要分开处理传送数据的各个部分的情况下,散射/收集可能非常有用。例如,如果一个消息由header和body组成,那么就可以将头和body保存在单独的缓冲区中。这样会使您更容易单独使用标题和正文。
散射读取
“散射读取”将数据从单个通道读入到多个缓冲器。
这是一个原理的Scatter
流程图:
![]() |
Java NIO:散点读取 |
这是一个代码示例,显示如何执行散射读取:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024); ByteBuffer [] bufferArray = {header,body}; channel.read(bufferArray);
首先如何将缓冲区插入到数组中,然后将该数组作为参数传递给该channel.read()
方法。read()
方法然后按照缓冲区在数组中的顺序从通道写入数据。一旦缓冲区已满,通道将继续运行以填充下一个缓冲区。
散射读取在移动到下一个之前填满一个缓冲区,这意味着它不适合于动态大小的消息部分。换句话说,如果你有一个标题和一个主体,并且标题是固定的大小(例如:128字节),那么散射读取工作正常。
收集写入
“采集写入”将数据从多个缓冲区写入单个通道。
流程图如下:
![]() |
Java NIO:收集写 |
这是一个代码示例,显示如何执行收集写入:
ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body = ByteBuffer.allocate(1024); //将数据写入缓冲区 ByteBuffer [] bufferArray = {header,body}; channel.write(bufferArray);
缓冲区的数组被传递到write()
方法中,该方法按照它们在数组中的顺序依次向缓冲区写入内容。只写入缓冲区的位置和限制之间的数据。因此,如果缓冲器的容量为128字节,但只包含58字节,则只有58个字节从该缓冲区写入通道。因此,与散射读取相比,收集写入对于动态大小的信息可以正好工作。
Java NIO 频道到频道转接
在Java NIO中,您可以将数据直接从一个通道传输到另一个通道。如果其中一个通道是FileChannel通道
。这个FileChannel
类有一个transferTo()
和transferFrom()
方法可以完成这项操作。
transferFrom()方法
FileChannel的transferFrom()
方法将数据从源通道传输到 FileChannel
。
以下简单的例子:
RandomAccessFile fromFile = new RandomAccessFile(“fromFile.txt”,“rw”);
FileChannel fromChannel = fromFile.getChannel(); RandomAccessFile toFile = new RandomAccessFile(“toFile.txt”,“rw”);
FileChannel toChannel = toFile.getChannel();
long position= 0;
long count = fromChannel.size();
toChannel.transferFrom(fromChannel,position,count);
参数位置和数量,告诉目标文件中开始写入的位置(position
),以及要最大传输(count
)多少个字节。如果源通道的count
字节少于传输的信道。
另外,一些 SocketChannel
实现方式可以只传输SocketChannel
在这里和现在的内部缓冲器已准备就绪的数据- 即使SocketChannel
稍后可能有更多的数据可用。因此,它可能不会将所请求的整个数据(count
)SocketChannel
传入FileChannel
。
transferTo()方法
该transferTo()
方法从一个FileChannel
其他通道传输。
简单的例子:
RandomAccessFile fromFile = new RandomAccessFile(“fromFile.txt”,“rw”);
FileChannel fromChannel = fromFile.getChannel(); RandomAccessFile toFile = new RandomAccessFile(“toFile.txt”,“rw”);
FileChannel toChannel = toFile.getChannel();
long position= 0;
long count = fromChannel.size(); fromChannel.transferTo(position,count,toChannel);
示例与上一个类似。唯一真正的区别是FileChannel
调用该方法的对象。其余的是一样的。
该方法SocketChannel
也存在问题transferTo()
。该SocketChannel
实现可能只从传输的字节FileChannel
,直到发送缓冲区已满,然后停止。
Java NIO学习笔记 三 散点/收集 和频道转换的更多相关文章
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Java NIO 学习笔记(二)----聚集和分散,通道到通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO学习笔记
Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...
- Java NIO 学习笔记(七)----NIO/IO 的对比和总结
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(四)----文件通道和网络通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(一)----概述,Channel/Buffer
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
随机推荐
- windows7重置网卡命令
点击windows左下角菜单键,输入cmd 然后鼠标右键 cmd 以管理员身份运行,并输入命令 netsh winsock reset, 然后回车执行. 系统会提示要求重启计算机. 重启后即重置网卡成 ...
- 使用fiddler进行接口测试
我们来说说如何使用fiddler做接口测试? 测试准备,抓到相应的接口和入参或者找接口文档,我这里就用聚合数据里面的接口做样例, 接口如下: 测试接口:http://japi.juhe.cn/qqev ...
- spring-AOP动态代理,以及aspectJ的xml配置或注解配置方法,各个拦截器的使用顺序
package com.itheima.aspect; public class MyAspect { public void check_Permissions(){ System.out.prin ...
- JAVA遇见HTML——JSP篇(JavaBeans)
1.像使用普通java类一样,创建javabean实例,利用构造方法创建实例 跟表单关联,“*”表示根据名称来进行匹配,就是根据表单所提交过来的参数的名字和Javabean当中的属性名字来进行一一匹配 ...
- Lua 学习之基础篇四<Lua table(表)>
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...
- csrf简单明了( 转发)
https://www.daguanren.cc/post/csrf-introduction.html csrf_token = request.META.get('CSRF_COOKIE') re ...
- python2.7 psycopg2
psycopg2 安装 sql='''INSERT INTO "CNYB"."PRE_DQ_PLANT"("ID", "ORG_I ...
- 2018 南京网络预赛Sum - 线性筛
题意 链接 定义 $f(x)$ 为满足以下条件的有序二元组 $(a, b)$ 的方案数(即 $(a, b)$ 与 $(b, a)$ 被认为是不同的方案): $x= ab$ $a$ 和 $b$ 均无平方 ...
- k8s 命令自动补全
yum install -y bash-completion source /usr/share/bash-completion/bash_completion source <(kubectl ...
- 关系型数据库与NoSQL的对比
SQL(结构化的查询语言)数据库是过去四十年间存储数据的主要方式.20世纪90年代末随着Web应用和MySQL.PostgreSQL和SQLite等开源数据库的兴起,用户爆炸式的增长. NoSQL数据 ...