JAVA NIO buffer (知识三)

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里常用的就是这些变量和方法。

时间: 2024-11-06 15:04:19

JAVA NIO buffer (知识三)的相关文章

JAVA NIO Selector 知识三

Selector(选择器) Selector工作流程:我们把想要的soketchannel告诉selector后,我们就去可以做别的事情,当有事件发生的时候,selector会通知我们,然后获取selectionkey,获得我们感兴趣的事件. selecotr是java nio多路复用的关键类,selector实现了一个线程管理多个channel,只需要更少的资源来处理更多的通道,节省线程之间的开销,这么说seletor是以前cpu很贵的时候,现在很多公司的机器都是多核,充分利用cpu才是最好的

Java NIO Buffer

Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.交互图如下: 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. 下面是NIO Buffer相关的话题列表: 1.Buffer的基本用法 使用Buffer读写数据一般遵循以下四个步骤: 写入数据到Buffer 调用flip()方法 从Buffer中读取数据 调用clear()方法或者com

【JAVA】【NIO】4、Java NIO Buffer

Java NIO的Buffer用于和channel进行交互. buffer本质上是一个内存块,你可以写数据,然后读取出来. 这个内存块是通过NIO的Buffer对象进行包装的,该对象提供了一系列的方法,使得对内存块的访问更加容易了. 基本的Buffer使用 使用Buffer读写数据一般有如下4步: 1.将数据写入 Buffer 2.调用buffer.flip()方法 3.从Buffer中读出数据 4.调用buffer.clear()方法或buffer.compact()方法 当你将数据写入buf

java nio学习(三)

Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. Buffer的基本用法 使用Buffer读写数据一般遵循以下四个步骤: 写入数据到Buffer 调用flip()方法 从Buffer中读取数据 调用clear()方法或者compact()方法 当向buffer写入数据时,buffer会

Java NIO 基础知识

前言 前言部分是科普,读者可自行选择是否阅读这部分内容. 为什么我们需要关心 NIO?我想很多业务猿都会有这个疑问. 我在工作的前两年对这个问题也很不解,因为那个时候我认为自己已经非常熟悉 IO 操作了,读写文件什么的都非常溜了,IO 包无非就是 File.RandomAccessFile.字节流.字符流这些,感觉没什么好纠结的.最混乱的当属 InputStream/OutputStream 一大堆的类不知道谁是谁,不过了解了装饰者模式以后,也都轻松破解了. 在 Java 领域,一般性的文件操作

java NIO代码演示三种流

package com.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; pu

Java NIO —— Buffer(缓冲区)

Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.注意:Buffer是非线程安全类. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. NIO 有以下几种Buffer类型: ByteBuffer MappedByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuffer capacity

JAVA NIO系列(三) Buffer 解读

缓冲区分类 NIO中的buffer用于和通道交互,数据是从通道读入缓冲区,从缓冲区中写入通道的.Buffer就像一个数组,可以保存多个类型相同的数据.每种基本数据类型都有对应的Buffer类: 缓冲区的属性 1.capacity(容量):buffer本质是一个数组,在初始化时有固定的大小,这个值就是容量.容量不可改变,一旦缓冲区满了,需要将其清空才能将继续进行读写操作. 2.position(位置):表示当前的位置,初始化时为0,当一个基本数据类型的数据写入buffer时,position会向前

java NIO buffer --directBuffer (2)

HeapBuffer ----堆缓冲    :其实是在java 的内存模型中,java 虚拟机可以直接管控的 DirectBuffer ---直接缓冲 :使用的是native ,与操作系统挂钩,调用的是c 或者c++ 的代码,不在java 的内存模型中,我们称为堆外内存,因为不属于java 内存模型,所以java 虚拟机管控不到: 但是 address 维护了堆外内存的引用 (在buffer 类中维护者 long address) 那么问题来了,为什么不直接用HeapBuffer 操作,反而 使