【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()方法

当你将数据写入buffer,它会记录你写入了多少数据。一旦你去读数据的时候,你需要反转buffer,通过flip方法,将buffer从写模式转为读模式。在读模式中,buffer允许你读取所有写进去的数据。

一旦你读取了所有的数据,你需要清除buffer,让它再一次为写做好准备,有两种方式:clear()或compact()。clear清除了整个buffer,compact仅仅清除你已经读过的数据。其它未读数据将被移动到buffer的头部,现在写入的数据就会在未读的数据之后。

实例:

注意代码中flip,clear等的调用顺序

Buffer的capacity,position和limit

Buffer有三个属性,如上所示

position和limit依赖于Buffer是在读模式还是写模式。Capacity无关模式,总是相同的。

看一张图

Capacity

Buffer有固定的大小,叫做capacity,又可以写capacity个字节类型,长整型,字符型等数据,写入buffer。一旦buffer满了,在写入数据之前,你需要置空它(读或者清除)。

Position

当你把数据写入Buffer,就会写到了某个position。position初始为0。当数据写入了,position就会指向写一个插入数据的位置。position最大值为capacity-1。

当你从Buffer中读数据,你也是从某个position开始读。当你flip一个缓冲区从写模式到读模式,position就被重置为0了。读数据的时候,position也会一直移动,指向下一个读的位置。

Limit

在写模式中,limit代表你可以写入多少数据,等于buffer的capacity。

当你flip为写模式的时候,limit代表你可以读出多少数据,因此当flip为读模式,limit被设置为写模式中的position。换句话说,你可以读取写入过的所有数据。

Buffer Types

Java NIO中提供如下Buffer类型:

·ByteBuffer

·MappedByteBuffer

·CharBuffer

·DoubleBuffer

·FloatBuffer

·IntBuffer

·LongBuffer

·ShortBuffer

这些Buffer类型代表不同的数据类型。MappedByteBuffer在后续章节会说。

Allocating a Buffer

为了获取一个Buffer对象,你必须首先分配一块空间。每一个Buffer类都有一个allocate方法。

ByteBuffer buf = ByteBuffer.allocate(48);

CharBuffer buf = CharBuffer.allocate(1024);

Writing Data to a Buffer

写数据到buffer有两种方式:

1、从channel写数据到buffer

2、通过buffer的put方法给自己写数据

int bytesRead = inChannel.read(buf); //read into buffer.

buf.put(127);

flip()

flip方法将缓冲区从写模式转成读模式。调用flip方法将position设置为0,将limit设置为position刚刚之前的位置。

换言之,position现在是读的位置,limit是读的最多限制。

Reading Data from a Buffer

同样两种方式可以从buffer中读数据:

1、将数据从buffer中读到channel中

2、通过get方法从自己读

//read from buffer into channel.

int bytesWritten = inChannel.write(buf);

byte aByte = buf.get();

rewind()

该方法设置position为0,所以你可以重新读buffer中的所有数据了。limit保持不变,仍然表示可以从buffer中读取多少数据。

clear() and compact()

一旦你读完了buffer的数据,你必须再次将buffer准备好写,通过clear或者compact方法。

clear方法将position设置为0,limit设置为capacity。换言之,buffer清理了,buffer中数据并未清除,只是标记告诉你从哪开始写数据。

如果有任何未读的数据,当你调用clear方法,数据将被忽略。无法找回。

如果仍然有数据未读,但是你想稍后再读取,你可以调用compact而不是clear。

compact方法将所有未读数据移动到buffer的头部,设置position未未读数据的最后一个位置,limit=capacity。现在buffer准备写,但是未读数据不会被重写。

mark() and reset()

可以通过mark方法去标记一个buffer中position,稍后你可以通过reset方法将position设置你刚刚标记的位置。

buffer.mark();

//call buffer.get() a couple of times, e.g. during parsing.

buffer.reset(); //set position back to mark.

equals() and compareTo()

比较两个buffer是否相等。

equals()

两个buffer如果相等,满足如下条件:

1、类型相同

2、buffer中内容空间相同

3、buffer中内容相同

compareTo()

该方法比较buffer中内容,比如排序等等

1、

时间: 2024-10-10 16:29:55

【JAVA】【NIO】4、Java NIO Buffer的相关文章

Java Nio 十六、Java NIO Files

最后更新:2015-04-15 这个Java NIO的Files类(java.nio.file.Files)提供了数个方法中文件系统中操作文件.这个Java NIO的Files类教程将会覆盖这些方法的大部分通用方法的使用.这个类包含了许多的方法,所以也可以核对这个JavaDoc,如果你需要一个没有在这里描述的方法.这个Files类只是可能为了它仍然有一个方法. 这个java.nio.file.Files类同java.nio.file.Path实例一起工作,以至于你在同Files类工作之前需要理解

Java第二天——标识符命名规则、Java的知识、快捷键的使用、Scanner获取值的常用方法

1.标识符命名规则 字母.下划线.数字.美元符号($)由这四个部分组成. 标识符=首字母+其他 首字母:字母.下划线.美元符号($) 其他:字母.下划线.数字.美元符号($) 注意: 1.首字母不能为数字 2.标识符不能是关键字 3.java语言严格区分大小写,比如:$name $Name表示两个不同的标识符 2.java程序的注释: 单行注释(//).多行注释(/**/).文档(doc)注释 单行注释:一般用于对每一行代码进行说明 多行注释:一般用于对每一段代码.某个方法.某个源文件进行解释说

elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RESTful style API这一层,这种客户端的连接方式是RESTful风格的,使用http的方式进行连接 3.2 Transport 连接 端口 9300 这种连接方式对应于架构图中的Transport这一层,这种客户端连接方式是直接连接ES的节点,使用TCP的方式进行连接 4. ES提供了多种

Java Nio 十四、Java NIO vs. IO

最后更新时间:2014-06-23 当学习Java NIO和IO的API的时候,一个问题很快的就会出现中我们的脑中: 我什么时候应该使用IO,什么时候应该使用NIO? 在这篇文章中我将会尝试着写出中NIO和IO之间不同的地方,他们的使用场景,以及他们怎么影响你的代码设计. Java NIO和IO的主要不同 下面的表格总结了Java NIO和IO的主要不同.针对这个表格中的不同点我将会给予更加详细的说明. IO NIO 基于流的 基于缓冲区的 堵塞IO 非堵塞IO   Selectors(选择器)

java的几个版本以及jre,jdk等概念——【转载】JDK、Java SE、Java EE、Java ME我该选

我们平时使用的一些软件,有一部分需要Java环境的支持,但是SUN那么多的产品,让人眼花缭乱的版本号,前看后看都差不多的缩写,让我们选择起来的时候常常望而却步,只好跟着感觉走.所以下面我要介绍的就是那些让大家困惑的东西,首先让我们看看SUN的产品之多:下载地址:http://developers.sun.com/downloads/ 哈哈还没有展开它们的子选项呢,让人眼花缭乱,下面介绍大家使用的比较广泛的名词吧:(一)J2SEJava2平台标准版(Java2 Platform Standard

Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)

1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘复制到内核空间再复制到用户空间,内存映射文件避免了第二次复制,且内存分配在内核空间,应用程序访问的就是操作系统的内核内存空间,因此极大提高了读取效率.写文件同理. 2.堆内存分配与直接内存分配: Java申请空间时通常是从JVM堆内存分配的,即 ByteBuffer.allocate(int cap

Java--- J2EE、Java SE、Java EE、Java ME 区别

java SE=Java Standard EditionJava EE=Java Enterprise EditionJava ME=Java Mobile Edition SE主要用于桌面程序,控制台开发(JFC)EE企业级开发(JSP,EJB)ME嵌入式开发(手机,小家电) 目前,Java 2平台有3个版本,它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition,J2ME).适用于桌面系统的Java 2平台标准版(Java 2

JAVA程序员的前景如何,JAVA好学吗怎么自学?

JAVA在主流编程语言中的重要地位绝对可以排进TOP3,JAVA在C++的基础上扬弃发展,吸收优点,摒弃多继承.指针等难点.因此JAVA不但功能强大,而且简单易用,无论是学习还是使用都比C++更好上手. java还拥有广泛的应用市场,它的生态系统几乎涵盖了目前市面上所有的软硬件,java几乎是万能的,你能想到的,java基本都能实现. web开发:京东.淘宝.美团这些大型网站,都是用JAVA做的. 移动端开发:目前手机上所有的APP后台代码及部分移动端页面java是都能够做到的. 客户端开发:主

Java理解程序逻辑——第一章 初识Java

1. 计算机程序: 为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合. 2. JAVA相关的技术:      1).安装和运行在本机上的桌面程序      2).通过浏览器访问的面向Internet的应用程序      3).JAVA 还能做出非常炫的图像效果 3. 开发JAVA程序的步骤:               1).编写源程序               2).编译源程序               3).运行 4. JAVA程序的基本框架:          1).

【JAVA】【NIO】3、Java NIO Channel

Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·FileChannel ·DatagramChannel ·SocketChannel ·ServerSocketChannel FileChannel从文件读数据或写进文件 DatagramChannel通过UDP在网络上读写数据 SocketChannel通过TCP在网络上读写数据 ServerSock