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
,直到发送缓冲区已满,然后停止。
转载于:https://www.cnblogs.com/kuoAT/p/6999939.html
Java NIO学习笔记 三 散点/收集 和频道转换相关推荐
- Java NIO学习笔记三------Chanel的四种实现篇
FileChannel FileChannel是什么 FileChannel是一个连接到文件的通道,可以通过文件通道读写文件.它无法设置为非阻塞模式,总是运行在阻塞模式下. 打开FileChannel ...
- Java NIO 学习笔记(三)----Selector
目录: 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学习笔记之图解ByteBuffer
转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...
- Java基础学习笔记(三)_Java核心技术(高阶)
本篇文章的学习资源来自Java学习视频教程:Java核心技术(高阶)_华东师范大学_中国大学MOOC(慕课) 本篇文章的学习笔记即是对Java核心技术课程的总结,也是对自己学习的总结 文章目录 Jav ...
- Java NIO学习系列三:Selector
前面的两篇文章中总结了Java NIO中的两大基础组件Buffer和Channel的相关知识点,在NIO中都是通过Channel和Buffer的协作来读写数据的,在这个基础上通过selector来协调 ...
- Java nio 学习笔记 相关知识
http://blog.csdn.net/tsyj810883979/article/details/6876594 一.基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. ...
- Java NIO学习笔记
印象中,我对于NIO的学习,最早是来源于一次面试,面试官问我:"可不可以讲一下Netty的线程模型?".当然了,这个问题没答上来,于是回去后就开始搜Netty的资料,了解Netty ...
- Java基础学习笔记三 Java基础语法
Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...
最新文章
- 相机模型--A Unifying Theory for Central Panoramic Systems and Practical Implications
- 编程之美2.2 不要被阶乘吓倒
- 007_Curator框架二
- 150. Leetcode 860. 柠檬水找零 (贪心算法-基础题目)
- install pyinstaller
- 数组以及对象遍历方法对比
- Spring整合web开发
- windows和linux下,查看oracle SID的方法
- c++ 每半个小时打印一次_有了3D打印机,后期该如何维护呢
- OpenGL图形渲染管线(Pipeline)学习
- tensorflow入门(一)波士顿房价数据集
- GameSalad:率先使用HTML5发布新游戏
- STM32+GM65二维码识别模块
- 气缸模组控制一以1200PLC为例从易到难学习
- csharp基础练习题:卡塔劳尔【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
- tempo 2.0 学习记录
- python识别图形形状
- Photoshop for Mac(图像处理软件)破解版安装
- 高数考研归纳 - 积分学 - 重积分
- Ubuntu 16.04 LTS + CUDA 8.0 + GTX960M
热门文章
- PyQt5-高级控件使用(QTableView)
- 雇佣K个工人的最小费用 Minimum Cost to Hire K Workers
- Maven学习(八)-----Maven依赖机制
- 结对编程项目的过程记录与收获
- 诗与远方:无题(十四)
- Mybatis01(结果集封装)
- python使用sqlite
- ASP.NET Core 设置允许跨域访问
- Implementation of the USB 3.0 controller not found!
- STL(六)——max_element和min_element