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 ...
随机推荐
- 用js刷剑指offer(反转链表)
题目描述 输入一个链表,反转链表后,输出新链表的表头. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ f ...
- 用js刷剑指offer(数值的整数次方)
题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 牛客网链接 思路 快速幂算法,举个例 ...
- 搭建简单的mongod服务器
1.首先,创建一个叫做mongodb_simple的目录,进入到目录中. 2.创建文件夹:data,用来存储数据库的数据文件. 3.创建文件夹:log,用来存储数据库的日志文件. 4.创建文件夹:bi ...
- 教程|Anaconda在Windows上安装及使用
Anaconda是一个python环境管理软件.可以建立环境,并向环境装安装自己需要的包. 其优势是可以不用自己一个一个安装包,极大地减少了因为配置环境而产生的时间成本:同时多个环境相互独立,为不同项 ...
- Docker常用命令行
原文出处:https://blog.csdn.net/qq_29303759/article/details/87639016 启动docker 启动docker systemctl start do ...
- VCL界面开发必备装备!DevExpress VCL v19.1.7你值得拥有
DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...
- 题解[NOIP2017] 列队
题解[NOIP2017] 列队 题面 解析 看到这题时感觉这个编号很难维护啊? 后来看了lzf大佬的题解才会.. 首先,考虑一个稍微暴力的做法, 维护每一行的前\(m-1\)个人和最后一列的\(n\) ...
- 012_Linux驱动之_wait_event_interruptible
1. 首先这篇博客讲解得挺好的,推荐 wait_event_interruptible 使用方法 2 .函数原型: #define wait_event_interruptible(wq, condi ...
- 深入理解Java输入输出流
Java.io包的File类,File类用于目录和文件的创建.删除.遍历等操作,但不能用于文件的读写. Java 对文件的写入和读取涉及到流的概念,写入为输出流,读取为输入流.如何理解流的概念呢?可以 ...
- ueditor粘贴从word中copy的图片和文字 图片无法显示的问题
我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...

