缓冲区由当前的多个线程使用是不安全的。如果一个缓冲区由不止一个线程使用,则应该通过适当的同步来控制对该缓冲区的访问。
缓冲区有以下四个属性:
-
capacity
(容量):缓冲区的容量是它所包含的元素的数量。缓冲区的容量永远不会为负并且从不会更改。
-
limit
(限制):缓冲区的限制是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,并且永远不会大于其容量。
-
position
(位置):缓冲区的位置是下一个要读取或写入的元素的索引。缓冲区的位置永远不会为负,并且永远不会大于其限制。
-
mark
(标记):缓冲区的标记是在调用reset 方法时其位置将被重置到该mark位置。如果定义的标记后,位置(position)或限制(limit)调整为小于标记的值时,该标记将被丢弃。如果未定义标记,则调用 reset 方法将导致抛出InvalidMarkException。
传输数据定义了两种get和put操作:
相对操作
:操作读取或写入从当前位置开始的一个或多个元素,然后将该位置增加传输的元素的数量。
绝对操作
:操作采用显式元素索引,不会影响位置。
四属性之间的关系
0 <= 标记(mark) <= 位置(position) <= 限制(limit) <= 容量(capacity)
新创建的缓冲区位置为零(position = 0)和标记未定义(mark = -1)。初始限制可以为零,也可以是其他某个值,这取决于缓冲区类型及其构建方式。一般情况下,缓冲区的初始内容未定义。
clear()
清除此缓冲区。将位置设置为零,限制设置为该容量,并且丢弃标记。 源码:
position = 0;
limit = capacity;
mark = -1;
在get或put操作填充此缓冲区之前调用此方法。例如:
buf.clear(); // 准备写
in.read(buf); // 读取
注:此方法并没有实际擦除缓冲区中的数据。
flip()
反转此缓冲区。首先将当前位置设置为限制,然后将该位置设置为零。如果已定义了标记,则丢弃该标记。源码如下:
limit = position;
position = 0;
mark = -1;
在缓冲读取或put操作之后,调用此方法以做好缓冲写入或相对get操作。例如:
buf.put(magic); // 预置报头
in.read(buf); // 从输入通道中读取数据并紧跟在报送后存放
buf.flip(); // 准备读
out.write(buf); // 把头与体写到输出通道
当将数据从一个地方传输到另一个地方时,经常将此方法与compact方法一起使用。
rewind()
重置此缓冲区。将位置设置为零并丢弃标记。 源码如下:
position = 0;
mark = -1;
在缓冲重新写入或get操作之前调用此方法(假定已经适当设置了限制)。例如:
out.write(buf); // 剩余数据写入输出通道
buf.rewind(); // 重绕
buf.get(array); // 复制数据到array
mark()
在此缓冲区的位置设置其标记,
把mark设为position
。源码如下:
mark = position;
reset()
将此缓冲区的位置重新设置成以前标记的位置。 调用此方法既不会更改也不会丢弃标记的值。 源码如下:
position = mark;
其他方法:
capacity()
:
返回buffer的capacity(容量)
limit()
:返回此缓冲区的限制
limit的值
。
limit(int lim)
:设置limit的值。
position()
:返回此缓冲区的位置
position
。
position(int pos)
:设置position的值。
remaining()
:返回当前位置与限制之间的元素数量
(limit - position)
。
hasRemaining()
:如果position和limit之间还有数据,就返回true。
分享到:
相关推荐
总的来说,Java NIO API提供了一种更加高效、灵活的I/O编程模型,它通过Buffer、Channel和Selector这三个核心组件,实现了数据的缓冲和异步传输,极大地提升了Java在处理I/O操作时的性能和并发能力。开发者可以根据...
Java NIO提供了一系列Buffer类,如ByteBuffer、CharBuffer、IntBuffer等,它们都继承自抽象类Buffer。 - **选择器(Selectors)**:选择器允许单线程处理多个通道,通过注册感兴趣的事件(如读、写、连接和接受)并...
14-Java NIO-Buffer-三个属性和类型.mp4 17-Java NIO-Buffer-缓冲区分片.mp4 18-Java NIO-Buffer-只读缓冲区.mp4 19-Java NIO-Buffer-直接缓冲区.mp4 21-Java NIO-Selector-概述.mp4 23-Java NIO-Selector-示例代码...
- **`java.nio`**:此包定义了`Buffer`接口及其实现,如`ByteBuffer`,它们用于存储原始数据类型。`ByteBuffer`尤其重要,因为它常用于`java.nio.channels`中的通道操作。 - **`java.nio.channels`**:这是NIO的...
Java NIO提供了多种类型的缓冲区,如ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer和LongBuffer等,它们都继承自抽象类Buffer。缓冲区具有容量、限制和位置等属性,以及诸如put、get和flip等操作...
java.nio 中定义了 Buffer 及其数据类型相关的子类,而 java.nio.channels 中定义了一系列处理 IO 的 Channel 接口以及这些接口在文件系统和网络通讯上的实现。通过 Selector 这个类,还提供了进行非阻塞 IO 操作的...
本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...
Java NIO-Buffer-三个属性和类型 - **主要内容**:详细解析Buffer的三个核心属性(容量、位置、限制)以及不同类型Buffer的特点。 - **学习目标**:掌握Buffer的内部机制和不同类型的Buffer。 #### 15. Java NIO-...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)相比,具有更高的并发性能和资源管理效率。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)...
这个压缩包中的动态演示应该会涵盖这些概念,并通过可视化的方式展示Buffer如何在不同的I/O操作中变化,帮助开发者更好地理解和应用Java NIO的Buffer机制。通过实际的观察和实践,可以加深对NIO的理解,提升代码的...
在Java的NIO体系中,核心概念包括通道(Channel)、缓冲区(Buffer)、选择器(Selector)等。通道是数据读写的基础,它连接到数据源或目的地,如文件、网络套接字、管道等。缓冲区则用于存储和传输数据,它是NIO的...
"Java NIO.pdf" Java NIO(Non-blocking I/O)是Java平台中的一种I/O处理方式,它提供了面向缓冲区的I/O处理机制,可以实现高性能、高效的I/O操作。 缓冲区(Buffer) 缓冲区是Java NIO中非常重要的一个概念,它...
缓冲区具有容量、位置和限制等属性,可以通过get和put方法进行数据读写。 3. **选择器(Selector)**:选择器允许单个线程检查多个通道上的事件,如连接请求、数据到达等,极大地提高了多路复用的能力。通过注册通道...
### Java-NIO2教程知识点详解 #### I/O发展简史 - **JDK1.0-1.3**: 在此期间,Java的I/O模型主要依赖于传统的阻塞I/O方式,这种模式下,应用程序在等待I/O操作完成时无法执行其他任务,导致效率低下。此外,当时的...
### JAVANIO简介 #### 一、基本概念与传统IO 在计算机科学领域中,**IO(Input/Output)**是指主存与外部设备(如硬盘、终端、网络等)之间传输数据的过程。它是操作系统的一项核心功能,通过专用的I/O指令来实现。...
Java NIO Buffer 的主要方法: * allocate(): 创建一个新的 Buffer * put(): 将数据写入 Buffer * flip(): 将 Buffer 从写模式转换到读模式 * get(): 读取 Buffer 中的数据 * clear(): 清除 Buffer,为下次写入...
- Java NIO中的通道类似于流(Stream),但是它支持与缓冲区(Buffer)交互,以及非阻塞模式。 2. **缓冲区(Buffer)**: - 用于在通道(Channel)和网络套接字(Socket)之间来来去去的数据是储存在缓冲区中的...
在Java NIO中,Buffer类是所有其他缓冲类的基类,为所有缓冲器类型提供了通用方法。下面详细说明Java NIO中的主要类和方法。 Buffer类(C.1.1): Buffer类是一个抽象类,提供了缓冲区操作的基本结构。以下是一些...
Java NIO定义了多个Buffer类,如ByteBuffer、CharBuffer、IntBuffer等,每个Buffer都有容量、位置、限制等属性,可以进行读写操作。 3. **选择器(Selectors)**:选择器用于监控多个通道的状态,当某个通道准备就绪...