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()相关推荐

  1. java nio rewind_java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别

    java.nio.ByteBuffer 1. ByteBuffer中的参数position.limit.capacity.mark含义: position:表示当前指针的位置(下一个要操作的数据元素的 ...

  2. java nio rewind_java.nio.ByteBuffer 以及flip,clear及rewind区别

    Buffer 类 定义了一个可以线性存放primitive type数据的容器接口.Buffer主要包含了与类型(byte, char-)无关的功能. 值得注意的是Buffer及其子类都不是线程安全的 ...

  3. java.nio.Buffer 中的 flip()方法

    在Java NIO编程中,对缓冲区操作常常需要使用  java.nio.Buffer中的 flip()方法. Buffer 中的 flip() 方法涉及到 Buffer 中的capacity.posi ...

  4. 一条消息是如何按照二进制协议写入到Batch中的ByteBuffer中的

    double-check模式中会将消息放到Batch中: //将消息放到batch中去 FutureRecordMetadata future = Utils.notNull(batch.tryApp ...

  5. NIO-java.nio.ByteBuffer中flip、rewind、clear方法的区别

    原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...

  6. java nio rewind_NIO-java.nio.ByteBuffer中flip、rewind、clear方法的区别

    原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...

  7. java.nio.ByteBuffer中flip、rewind、clear方法的区别

    对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...

  8. [转] java.nio.ByteBuffer中flip、rewind、clear方法的区别

    转载 对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限 ...

  9. css 中 float 和 clear 的作用

    相当于原来的 align 的作用,但能力要比 align 强的多.一旦发出float:left或float:right命令,被我浮动的对像就会向左或向右移动直到遇到边框( border) .填充( p ...

最新文章

  1. 解决 “OperationalError: (sqlite3.OperationalError) no such table: ...“问题
  2. C#多线程编程(转)
  3. java 十进制 左移,java移位运算符之十进制转二进制
  4. spring5企业级开发实战 pdf_终于总结出Spring全家桶+微服务设计模式+Netty+MySQL调优PDF...
  5. HTML5博客个人日志记录网页模板
  6. Android 功耗(22)---MTK 功耗问题分析
  7. 服务器常用的状态码及其对应的含义如下
  8. Angular / RxJs我应该何时退订`Subscription`
  9. CImage 设置任意像素的RGB值
  10. 每周一磁 · 磁性材料的居里温度与工作温度
  11. android tts离线库,【Android语音合成TTS】云知声离线TTS使用详解
  12. css:字母hover文字加粗,盒子变宽,导致文字列表抖动
  13. 数据结构 期末复习主观题练习题(答案版)
  14. IDEA查看jks文件
  15. 按照jdk后cmd输入java -version命令查询jdk版本号无结果
  16. python编程做联机游戏大全单机_如何将一款单机双人的游戏做成联机版?
  17. 从无到有学习物联网00-千里之行始于足下
  18. PDF Focus .Net指在帮助您开发需要转换任何PDF文档的应用程序
  19. 艾宾浩斯背词法(网络收集)
  20. 中国市场Android终端App兼容性质量报告

热门文章

  1. 【C++STL】string类
  2. IBM停止招聘可被AI取代的职位;三星禁止员工使用ChatGPT;印象笔记官方AI免费课;清华美院AI绘画的高质量分享 | ShowMeAI日报
  3. 2018招商银行深圳分行面试经历
  4. 802.1Q VLAN技术原理
  5. 解析本地JOSN为Null
  6. 贪心算法求解一个序列中出现次数最多的元素问题
  7. vue拖拽组件使用 嵌套使用
  8. 【附源码】计算机毕业设计SSM社区留守儿童帮扶系统
  9. [附源码]SSM计算机毕业设计关爱留守儿童志愿者管理系统PPTJAVA
  10. 讲真的,我并不看好元宇宙