JAVA NIO buffer (知识三)

news/2024/7/4 13:00:38

java nio 里的buffer是缓存数据,通常缓冲区是一个数组,字节数组,也可以是别的类型。最常用的就是bytebuffer,

还有一些其它的类型:

charbuffer,

shortbuffer,

intbuffer,

longbuffer,

floatbuffer,

doublebufer。


一开始在知识(一)里写到,想要用nio读取数据,都是从channel读取到buffer。然后应用从buffer读取数据,同样写数据也是,先把数据写到buffer中,然后读道channel中。


基本上都是围绕这些状态变量和一些常用方法来做一些操作。

常用的状态变量:position,limit,capacity,常用这个三个变量来跟踪缓冲区的数据。

position:

当你写数据到buffer中的时候,position表示的当前位置指针,初始位置为0,最大可写入位capasity-1。例如当你写入三个字节数据的时候,position就是3,指向数组的第四个元素,下次开始写的时候,就从4开始写入。

当你读数据的时候,也是从某个位置指针开始读数据。当buffer从写模式切换到读数据的时候,position要被设置为0


limit:

当在写模式的情况下,limit表示最多能写入到哪里,最多写入到多少数据。limit等于buffer的capasity。

当在读模式的情况下,limit表示最多能读出多少数据。注意一点就是,buffer从写模式切换到读模式的情况下,limit要被切换到position位置,如果position为0,那么limit也是在0的位置。


capasity:

这个没啥好说的,就是最大容量。这个最大容量就是开始分配的,比如bytebuffer这个类型的缓冲区,Bytebuffer.allocate(100),就是分配100个字节,capasity则就出来了。


常用的方法:flip(),clear(),compact(),mark(),reset(),rewind()方法

flip():

此方法是将buffer从写模式下转换成读模式,写模式转换成读模式,需要注意的是,position要置换成到0的位置,limit要被切换到position的位置。


rewind()

是将position的位置重新设置为0。


clear()和compact()方法:

为什么要把它俩放在一起说,因为它俩容易混淆,所有一起说区别一下。

clear()方法position数据为0,会到起始位置,limit则置换到capasity位置。buffer中的数据没有被清楚,我得理解就是把所有的状态变量重置成初始化位置。不再标记哪些读过,哪些写过,这些都不会被记得。


compact()方法则是把所有buffer中未读的数据拷贝到初始处,然后position则是从未读的最后一个位置的下一个来标识。


mark()和reset()方法:

mark根据英文名就是标记的意思,标记position的位置的,reset则是重置,重置什么呢,就是mark标记完了,


buffer里常用的就是这些变量和方法。



本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/1956602



http://www.niftyadmin.cn/n/3091681.html

相关文章

python语言可以处理数据文件吗_对于Python语言进行处理文件解读

如何在Python语言中复制和删除文件,以及怎样将一个完整的文件路径分解成目录部分和文件名部分,***,我们讲解目录的创建,以及如何在目录树中移动目录并处理文件。 对于文件和目录的处理,虽然可以通过操作系统命令来完成…

java内存区域与对象的访问

我们都知道,在学习java的时候,有一个东西是特别重要的,那就是java内存的划分,以及对象的访问是如何进行的,下面是我自己在一些书籍上整理的,学完了之后感觉特别有用!!! …

mysql5.6.20配置文件my.cnf参数详解

服务器为硬件dell-R710,硬盘为双SSD硬盘130G,服务器有两颗CPU,单颗cpu为12核,服务器在安装系统时CPU开启了超线程。逻辑cpu为48核。 此服务器为单纯的mysql服务器,此配置文件的参数主要是供笔者平时优化my.cnf作为参考。广大读者切…

java多线程中的等待唤醒机制--多生产者多消费者问题

在java多线程中,等待唤醒机制是最经典的也是最能够体现java多线程中的线程安全的问题,在写等待唤醒机制的时候,我们要先去了解什么是等待唤醒机制 等待唤醒机制就是指在多个线程进行并发的去操作同一个资源的问题, 以生产馒头和…

python作业代做_代做MATH 6141作业、代写Python课程设计作业、代做algorithms作业、代做Python编程作业...

代做MATH 6141作业、代写Python课程设计作业、代做algorithms作业、代做Python编程作业 日期:2018-12-05 11:11 Coursework 2: MATH 3018/MATH 6141 - Numerical methods Due: 13 December 2018 In this coursework you will implement given numerical algorithms.…

偏门套路:每天被动吸引150+精准淘宝粉

网上关于引流技巧的文章五花八门,看得你热血澎湃,但往往搞一两天大多数人就放弃了,甚至看完后根本没去操作。最后还抱怨:为什么我看了那么多东西还是赚不到钱!虽然我十分鄙视这种浮躁的心态,但也能够理解和体谅大家。因…

使用hibernate中的hql进行分页设置setMaxResults(int a)出错

今天在自己写项目的时候在进行hibernate分页的时候设置setMaxResults(int a)的时候一直出现错误 org.hibernate.exception.SQLGrammarException: could not execute queryat org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)at org.hibernate.e…

python数据分类_在python中将数据分类为具有相同间隔大小的n类别

假设我想将以下数据分类为12类: no. grades 0 9.08 1 8.31 2 7.42 3 7.42 4 7.42 5 7.46 6 9.67 7 11.77 8 8.81 9 6.44 10 9.40 11 9.06 12 10.52 13 6.19 14 5.04 15 5.04 16 9.44 17 5.87 18 2.67 19 6.99 20 9.08 21 6.64 22 4.83 23 4.47 24 6.61 25 6.61 26 7…