你可以把ByteBuffer看着是一段连续内存(实际却不一定),或Byte的数组。Buffer类则提供了很多方法去访问/设置元素。而基于之上的CharBuffer,IntBuffer等则是是数据类型的抽象。
1. Buffer 类图
2. 主要属性
Capacity,能容纳的最多元素个数,构造时固定的;
Limit,读写元素的边界,可修改;
Position,当前读写位置,可修改;
Mark,标记位,书签位,不能超过limit,未设置前为undefined状态;
0 <= mark <= position <= limit <= capacity
3. 难理解的API
3.1 flip
将position指向0,limit指向最后一个元素之后的一个位置,为读元素做好准备。
flip前:
flip后:
flip两次后,position和limit都变成了0。
3.2 rewind
倒带,设置position为0,相当于position(0);
3.3 compact
将已读完的元素去除,把未读的元素向前移位,将position移到所有未读元素之后,准备写入元素。
compact前:
compact后:
3.4 mark
标记一个位置,reset()将读写指针返回到当前的标记位。
清除标记的方法有:rewind(),clear(),flip(),position(index),limit(index)(如果index < mark).
3.5 clear和reset
clear是清除所有元素,reset是将读写指针返回到当前的标记位。
3.6 equals
下列条件成立则相等:
Buffer同类型;
Buffer剩余元素数目、顺序、值相等,即position和limit之间的元素相等,和capacity,其他元素无关;
3.7 compare
比较也是比较剩余元素,但按照字符串比较的方式进行。
3.8 块移动(Bulk Move)
Buffer可以以块的方式读取或者写入,如:CharBuffer.get(char[] dst); CharBuffer.put(char[] dst),但需注意在读取或写入前,先调用Buffer.remaining()获取剩余的元素个数,或剩余的空间,不然由于目标空间不够会抛出:BufferOverflowException。
3.9 创建Buffer
有两种方式创建Buffer,Buffer.allocate(int capacity);和Buffer.wrap(E[] elements);第一个方法会分配空间,第二种不会,它用elements的空间。
buffer.wrap(E[] elements, int offset, int length);仍然是整个数组,但设置position为offset,limit为length,因为wrap不会分配空间。
这两种方式创建的buffer都不是direct的,都是backing by 数组,hasArray()会返回true;支持数组的操作;
3.10 duplicate
该方法会创建一个新的buffer视图,它的position, limit, mark是独立的,它和原buffer都共享一个backing数组,因此它们任何一个对buffer的更改都会影响另外一个。
asReadyOnlyBuffer则创建一个只读的视图。
slice()则创建部分视图。
3.11 allocateDirect
调用操作系统分配缓冲区,该缓冲区不需要转换就直接可以被底层IO处理,高并发的IO应用重用该缓冲区可以显著提供IO效率,因为它避免了缓冲区的拷贝(JVM内的缓冲区需要拷贝到外部才能被底层IO处理)。
但分配此缓冲区的代价比较大,不能在JVM内部完成,且分配的缓冲区在JVM管理之外,即不是由JVM回收,除非重用率高,不然不推荐使用。
该方法分配的缓冲区,数组的方法是不支持的,会抛UnsupportOperationException。
3.12 asXxxBuffer
ByteBuffer可以创建各种Primitive类型的Buffer视图,如asIntBuffer()。
- 大小: 48.9 KB
- 大小: 27.9 KB
- 大小: 28.3 KB
- 大小: 27.8 KB
- 大小: 28.1 KB
分享到:
相关推荐
通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道...
Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。 ...
### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在Java 1.4版本中引入,NIO提供了一种全新的I/O编程方式,使得Java开发者能够更高效地处理I/O操作...
**NIO非阻塞模式**:相比之下,NIO采用了非阻塞模式,即当没有数据可读时,`read()`方法不会阻塞,而是立即返回。这意味着应用程序可以同时处理多个输入/输出操作,而不需要为每个操作分配一个独立的线程。这样的...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准的I/O模型的一种新机制。在传统的Java I/O中,使用的是Blocking I/O,即阻塞式I/O,这种模型下,线程在等待数据就绪时会被...
### Java NIO 详细教程知识点解析 #### 一、Java NIO 概述 Java NIO(New IO)是Java平台提供的一种新的IO操作模式,它首次出现在Java 1.4版本中,并在后续版本中不断完善。Java NIO 的设计目的是为了克服传统Java ...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O 不同,NIO 具有非阻塞的特性,可以提高在高并发场景下的处理能力。在这个实例中,"java NIO 消息推送实例" 旨在展示如何使用...
### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于高效处理I/O操作的重要框架。它在Java 1.4版本中被引入,替代了传统的IO模型,提供了更高级别的I/O操作机制,以适应并发编程的需求...
2. **缓冲区(Buffers)**:缓冲区是NIO的核心组件,用于存储和传输数据。与传统IO直接在流上读写不同,NIO需要先将数据存入Buffer,再从Buffer中读取或写入通道。 3. **选择器(Selectors)**:选择器允许单个线程...
Java NIO的核心组件主要包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors): - **通道(Channels)**:通道是数据传输的途径,类似于传统IO中的流。Java NIO提供了多种通道,如FileChannel用于文件...
Java NIO(New IO)是Java 1.4引入的一个新特性,它是对传统IO模型的重大改进,提供了更高效的数据处理方式。NIO的核心概念包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。它允许多个输入/输出操作...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO基于块I/O(Blocking I/O),而NIO则基于通道(Channels)和缓冲区(Buffers)...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于传统IO(基于字节流和字符流)的I/O操作方式。传统的IO模型是阻塞式的,而NIO的核心特点是非阻塞,这使得在处理大量并发I/O请求时更为高效。...
1. **Channels**: Channel是NIO的核心组件之一,它提供了一种从一个数据源(如文件、套接字或缓冲区)到另一个数据源传输数据的方式。SocketChannel是用于网络通信的通道,可以用于客户端与服务器建立TCP连接。 2. ...
在Java NIO中,数据是以通道(Channels)和缓冲区(Buffers)的形式进行传输,而不是直接通过流。这种设计使得NIO能够同时处理多个输入/输出操作,从而实现多路复用。 标题“nio.rar_NIO_NIO-socket_java nio_java ...