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 ...
随机推荐
- Django drf:分页器详解
一.简单分页(查看第n页,每页显示N条) 二.偏移分页(在第n个位置,向后查看n条数据) 三.CursorPagination(加密分页,只能看上一页和下一页,速度快) 一.简单分页(查看第n页,每页 ...
- Canal的简单使用(监控数据库数据的变化)
原文:https://www.cnblogs.com/java-spring/p/8930740.html canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据,用于实际工作中,比 ...
- sklearn线性回归实现房价预测模型
目录 题目要求 单特征线性回归 方案一 方案二 多特征线性回归 两份数据 ex1data1.txt ex1data2.txt 题目要求 建立房价预测模型:利用ex1data1.txt(单特征)和ex1 ...
- Red Hat Enterprise Linux 7.0
简介 Red Hat Enterprise Linux是Red Hat公司的Linux发行版,面向商业市场,包括大型机.红帽公司从Red Hat Enterprise Linux 5开始对企业版LIN ...
- Python2和Python3中新式类、经典类(旧式类)的区别
https://www.jianshu.com/p/6f9d99f7ad54 里面最后一张图应该输出 This is from C
- duilib学习领悟(3)
世上本无窗口,窗口只是人的眼睛和电脑屏幕及鼠标键盘相互操作后的视觉效果! 下面我们来看看我们之前讲过的代码: class CDuiFrameWnd : public CWindowWnd, publi ...
- 第93题:复原IP地址
一. 问题描述 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135 ...
- BZOJ 3894 / Luogu P4313 文理分科 (拆点最小割)
题面 中文题面- BZOJ 传送门 Luogu 传送门 分析 这道题类似于BZOJ 3774 最优选择,然后这里有一篇博客写的很好- Today_Blue_Rainbow's Blog 应该看懂了吧- ...
- 008_Linux驱动之_IO口的配置
1. 测试:配置S3C2440的GPF4,5,6为输出 2. 测试IO的地址从芯片手册中获取以下资料 3. 从上面可以看出配置输出对应的设置是01=输出,那么对应位如:[9:8]需要设置成=01 4. ...
- 添加tag
创建tag git tag -a V1 -m 'release 1' 创建了本地一个版本v1,同时添加注释 release 1 查看tag git tag 显示注释 git show V1 本地tag ...

