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 ...
随机推荐
- 学JAVA有哪些好的技巧方法?干货分享
作为编程语言届的老大哥,学习JAVA的人数不胜数,在这里分享一些学习JAVA的技巧以及方法,当然,这些技巧及方法使用范围包含但不限于JAVA. ① 笔记软件 印象笔记:多端互通很方便(https:// ...
- nginx用指针的值的最后一位来判断过期事件
nginx中,将地址的最后一位取出来,用Instace变量标识,用来判断是否连接已经被释放成为过期时间 为什么指针地址最后一位一定是0呢? 这里的内存地址,一定是内存分配器分配出来的地址,如new . ...
- Spring-Spring配置-依赖注入
5.Spring配置 5.1.别名 <!--别名,如果添加了别名,我们也可以使用别名获取到这个对象--> <alias name="user" alias=&qu ...
- mysql基础篇--库的管理
库的创建 create database [if not exists] 库名; 库的修改 alter database 库名 character set 字符集; #更改库的字符集 库的删除 dro ...
- 「Django」Xadmin应用
第一:命令安装xadmin2 pip install xadmin2 第二:setting.py中设置 INSTALLED_APPS INSTALLED_APPS = ( ... 'xadmin', ...
- 如何解决web大流量,高并发问题
对于当今大流量的网站,每天几千万甚至上亿的流量,是如何解决访问量问题的呢? 以下是一些总结的方法: 第一,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP, ...
- 内存泄露检测之mtrace
————————————————版权声明:本文为CSDN博主「知耻而后勇的蜗牛」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog ...
- 第九章 利用CSS3制作网页动画
一.CSS3变形transform 1.平移:translate(x,y) translateX(x) translateY(y) 注意:如果想只向X轴平移那么可以translateX,如果想只向X轴 ...
- CF922D Robot Vacuum Cleaner 贪心+排序
正确的贪心方法:按照比例排序. code: #include <bits/stdc++.h> #define N 200000 #define ll long long #define s ...
- c++ 容器反转并且拷贝到一个新容器中
// reverse_copy example #include <iostream> // cout #include <algorithm> // reverse_copy ...