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



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


相关文章
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
8月前
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
248 0
|
10月前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
264 3
|
10月前
|
存储 监控 Java
Java的NIO体系
通过本文的介绍,希望您能够深入理解Java NIO体系的核心组件、工作原理及其在高性能应用中的实际应用,并能够在实际开发中灵活运用这些知识,构建高效的Java应用程序。
290 5
|
11月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
209 0
Java NIO 开发
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
141 2
|
缓存 Java
java文件读取 while ((len = reader.read(buffer)) != -1){}的理解
本文解释了Java中使用`InputStreamReader`和`read(buffer)`方法循环读取文件内容的机制,强调了如何正确理解读取循环和处理读取到的数据,以及如何处理字符编码和换行符。
219 0
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
325 2
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
417 1