ByteBuffer中的flip()、clear()、compact()
NIO读取文件流的简单demo:
public static void main(String[] args) {try (FileChannel channel = new FileInputStream("data.txt").getChannel()){// 定义缓冲区 allocate分配大小ByteBuffer buffer = ByteBuffer.allocate(10);while(true) {// 去读缓冲区内容int read = channel.read(buffer);if(read != -1){// 切换为读模式buffer.flip();while (buffer.hasRemaining()) {System.out.println((char)buffer.get());}// 切换为写模式
// buffer.clear();buffer.compact();} else {break;}}} catch (Exception e) {e.printStackTrace();}}
在读取文件流时,正确姿势为:
- 向buffer写数据,如channel.read(buffer),此时默认为写模式
- 调用flip()切换为读模式
- 从buffer读取数据,如buffer.get()
- 调用clear()或compact()切换为写模式
- 重复以上步骤
为什么需要频繁切换读写模式呢?这里简单介绍一下flip(),clear(),compact()三者到底做了什么事。
1、ByteBuffer的内部结构
首先介绍三个属性:
capacity:bytebuffer容量大小
position:位移指针位置
limit:指针位移限制
ByteBuffer buffer = ByteBuffer.allocate(10)分配得到的初始空间大小为:
capacity:10字节
position:0
limit:为capacity的位置
当有数据写入时候,每写入一个字节,position往后移动一个字节位置,直到limit位置,该缓冲区满。
2、flip()方法
如需要读取缓冲区数据,使用flip()切换为读数据模式,此时position和limit指针位置发生变化。
position移动到最开始位置,limit移动到数据长度的末尾。每读取一个字节,position向后移动一个字节位置。直到limit位置处停止。
3、clear()方法
调用clear()方法,position和limit指针位置发生变化。
clear默认清空缓冲区,回到最开始分配的样子,即position=0,limit=capacity。
4、compact()方法
compact也可以切换为写模式,不过是把未读完成的数据向前压缩,然后再切换。
如果缓冲区中数据没有读取完,就需要立马写入数据,所以需要对未读取完的数据进行压缩,避免数据丢失。compact也会改变position和limit指针位置,但position != 0,而是等于上次读取的位置,limit=capacity位置。
简单随笔,以便后续查阅。
ByteBuffer中的flip()、clear()、compact()相关推荐
- java nio rewind_java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别
java.nio.ByteBuffer 1. ByteBuffer中的参数position.limit.capacity.mark含义: position:表示当前指针的位置(下一个要操作的数据元素的 ...
- java nio rewind_java.nio.ByteBuffer 以及flip,clear及rewind区别
Buffer 类 定义了一个可以线性存放primitive type数据的容器接口.Buffer主要包含了与类型(byte, char-)无关的功能. 值得注意的是Buffer及其子类都不是线程安全的 ...
- java.nio.Buffer 中的 flip()方法
在Java NIO编程中,对缓冲区操作常常需要使用 java.nio.Buffer中的 flip()方法. Buffer 中的 flip() 方法涉及到 Buffer 中的capacity.posi ...
- 一条消息是如何按照二进制协议写入到Batch中的ByteBuffer中的
double-check模式中会将消息放到Batch中: //将消息放到batch中去 FutureRecordMetadata future = Utils.notNull(batch.tryApp ...
- NIO-java.nio.ByteBuffer中flip、rewind、clear方法的区别
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...
- java nio rewind_NIO-java.nio.ByteBuffer中flip、rewind、clear方法的区别
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...
- [转] java.nio.ByteBuffer中flip、rewind、clear方法的区别
转载 对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限 ...
- css 中 float 和 clear 的作用
相当于原来的 align 的作用,但能力要比 align 强的多.一旦发出float:left或float:right命令,被我浮动的对像就会向左或向右移动直到遇到边框( border) .填充( p ...
最新文章
- 解决 “OperationalError: (sqlite3.OperationalError) no such table: ...“问题
- C#多线程编程(转)
- java 十进制 左移,java移位运算符之十进制转二进制
- spring5企业级开发实战 pdf_终于总结出Spring全家桶+微服务设计模式+Netty+MySQL调优PDF...
- HTML5博客个人日志记录网页模板
- Android 功耗(22)---MTK 功耗问题分析
- 服务器常用的状态码及其对应的含义如下
- Angular / RxJs我应该何时退订`Subscription`
- CImage 设置任意像素的RGB值
- 每周一磁 · 磁性材料的居里温度与工作温度
- android tts离线库,【Android语音合成TTS】云知声离线TTS使用详解
- css:字母hover文字加粗,盒子变宽,导致文字列表抖动
- 数据结构 期末复习主观题练习题(答案版)
- IDEA查看jks文件
- 按照jdk后cmd输入java -version命令查询jdk版本号无结果
- python编程做联机游戏大全单机_如何将一款单机双人的游戏做成联机版?
- 从无到有学习物联网00-千里之行始于足下
- PDF Focus .Net指在帮助您开发需要转换任何PDF文档的应用程序
- 艾宾浩斯背词法(网络收集)
- 中国市场Android终端App兼容性质量报告