NIO入门-了解Buffer

简介: NIO入门-了解Buffer   Buffer实例的状态由下面三个变量来决定: Position,这个变量表明已经读写了多少数据; Limit,这个变量表明还有多少数据需要读写; Capacity,这个变量表明缓冲区的最大容量。

NIO入门-了解Buffer

 

Buffer实例的状态由下面三个变量来决定:

  • Position,这个变量表明已经读写了多少数据;
  • Limit,这个变量表明还有多少数据需要读写;
  • Capacity,这个变量表明缓冲区的最大容量。

从大小关系来看,Position≤Limit≤Capacity。在通过Buffer进行读写的时候,Buffer.clear()和Buffer.flip()这两个函数将会改变这三个变量,我们可以通过下面这个例子来查看这个过程:

 

01 import java.io.FileOutputStream;
02 import java.nio.ByteBuffer;
03 import java.nio.channels.FileChannel;
04  
05 public class WriteFile {
06     static public void main(String args[]) throws Exception {
07         FileOutputStream fout = new FileOutputStream("out.txt");
08         FileChannel fcout = fout.getChannel();
09         ByteBuffer buffer = ByteBuffer.allocate(1024);
10  
11         buffer.putInt(3);
12         buffer.putInt(24);
13         buffer.putInt(7);
14         System.out.println(buffer.toString());
15         // 输出java.nio.HeapByteBuffer[pos=12 lim=1024 cap=1024]
16  
17         buffer.flip();
18         System.out.println(buffer.toString());
19         // 输出java.nio.HeapByteBuffer[pos=0 lim=12 cap=1024]
20  
21         fcout.write(buffer);
22         System.out.println(buffer.toString());
23         // 输出java.nio.HeapByteBuffer[pos=12 lim=12 cap=1024]
24  
25         buffer.clear();
26         System.out.println(buffer.toString());
27         // 输出java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024]
28     }
29 }

 

当我们要将数据写到输出通道之前(fux注:即调用session.write方法前),我们必须调用 flip() 方法。这个方法做了两件事情:

  1. 它将 limit 设置为当前 position,在WriteFile.class中,limit被设置成12,这意味着Buffer实例中保存了12字节数据;
  2. 它将 position 设置为 0,在WriteFile.class中,position被设置成0,这意味着Buffer实例下一个读写的位置从0开始。

而clear() 方法会重设缓冲区以便接收更多的字节,这个方法做了两件事情:

  1. 它将 limit 设置为与 capacity 相同。
  2. 它设置 position 为 0。

 

 

 

 

 

目录
打赏
0
0
0
0
13
分享
相关文章
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
54 1
|
5月前
|
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
68 2
📌 Java NIO Buffer
Java NIO缓冲区在与NIO通道交互时使用。数据从通道读取到缓冲区,然后从缓冲区写入通道。 缓冲区本质上是一块内存,可以在其中写入数据,然后再进行读取。这个内存块被封装在一个NIOBuffer对象中,该对象提供了一组方法,可以更容易地使用内存块。
NIO - 基础入门之通道和缓冲区
NIO - 基础入门之通道和缓冲区
105 0
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
选择器,也叫多路复用器,Java的NIO通过selector实现一个线程处理多个客户端链接,多个channel可以注册到同一个Selector,Selector能够监测到channel上是否有读/写事件发生,从而获取事件和对事件进行处理,所以Selector切到哪个channel是由事件决定的。当线程从某个客户端通道未读取到数据时,可以把空闲时间用来做其他任务,性能得到了提升。
180 0
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
理解Selector 和 Channel Selector 选择器,也叫多路复用器,可以同时处理多个客户端连接,多路复用器采用轮询机制来选择有读写事件的客户端链接进行处理。 通过 Selector ,一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 由于它的读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起。
278 0
即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第9 期。
228 0
即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
Netty入门到超神系列-BIO、NIO、AIO的认识
I/O概述 I/O其实是Input,Output的缩写,意思是输入和输出,比如:把磁盘中的一个文件读入Java内存中,站在Java内存的角度来看就是输入即input, 可以使用Java提供的输入流如:InputStream#read 来实现。如果是把一个段文本内容从Java内存中保存到磁盘上的某个文件,站在Java内存的角度来说就是输出,可以使用Java提供的输出流:OutputStream#write() 来实现。再比如把一个数据通过网络发送给其他服务器就是输出,或者从其他服务器接收一段数据就是输入。 I/O也是有很多种的,比如Java支持三种:BIO,NIO,AIO
345 0
Netty入门到超神系列-Java NIO零拷贝实战
这一章我们来操作一下NIO的零拷贝,这里我会先写代码样式一下传统IO数据拷贝场景下的耗时,然后再对比NIO场景下的考别耗时,通过耗时差异就能看到NIO零拷贝和传统IO拷贝的区别了。
143 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等