`

java.nio.Buffer属性及方法

    博客分类:
  • Java
阅读更多

缓冲区由当前的多个线程使用是不安全的。如果一个缓冲区由不止一个线程使用,则应该通过适当的同步来控制对该缓冲区的访问。

 

缓冲区有以下四个属性:

  • 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详解

    总的来说,Java NIO API提供了一种更加高效、灵活的I/O编程模型,它通过Buffer、Channel和Selector这三个核心组件,实现了数据的缓冲和异步传输,极大地提升了Java在处理I/O操作时的性能和并发能力。开发者可以根据...

    java-nio.rar_NIO_java nio

    Java NIO提供了一系列Buffer类,如ByteBuffer、CharBuffer、IntBuffer等,它们都继承自抽象类Buffer。 - **选择器(Selectors)**:选择器允许单线程处理多个通道,通过注册感兴趣的事件(如读、写、连接和接受)并...

    Java NIO实战开发多人聊天室

    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-示例代码...

    JavaNIO_API帮助文档详解

    - **`java.nio`**:此包定义了`Buffer`接口及其实现,如`ByteBuffer`,它们用于存储原始数据类型。`ByteBuffer`尤其重要,因为它常用于`java.nio.channels`中的通道操作。 - **`java.nio.channels`**:这是NIO的...

    java nio

    Java NIO提供了多种类型的缓冲区,如ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer和LongBuffer等,它们都继承自抽象类Buffer。缓冲区具有容量、限制和位置等属性,以及诸如put、get和flip等操作...

    jdk jdk jdk

    java.nio 中定义了 Buffer 及其数据类型相关的子类,而 java.nio.channels 中定义了一系列处理 IO 的 Channel 接口以及这些接口在文件系统和网络通讯上的实现。通过 Selector 这个类,还提供了进行非阻塞 IO 操作的...

    Java NIO学习笔记——ByteBuffer用法

    本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...

    java网络编程NIO视频教程

    Java NIO-Buffer-三个属性和类型 - **主要内容**:详细解析Buffer的三个核心属性(容量、位置、限制)以及不同类型Buffer的特点。 - **学习目标**:掌握Buffer的内部机制和不同类型的Buffer。 #### 15. Java NIO-...

    Java NIO原理分析及代码实例

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)相比,具有更高的并发性能和资源管理效率。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)...

    动态演示nio中的buffer相关操作.zip

    这个压缩包中的动态演示应该会涵盖这些概念,并通过可视化的方式展示Buffer如何在不同的I/O操作中变化,帮助开发者更好地理解和应用Java NIO的Buffer机制。通过实际的观察和实践,可以加深对NIO的理解,提升代码的...

    nio.zip_NIO_NewIO_NIO.c_java NIO chm_java nio

    在Java的NIO体系中,核心概念包括通道(Channel)、缓冲区(Buffer)、选择器(Selector)等。通道是数据读写的基础,它连接到数据源或目的地,如文件、网络套接字、管道等。缓冲区则用于存储和传输数据,它是NIO的...

    JavaNIO.pdf

    "Java NIO.pdf" Java NIO(Non-blocking I/O)是Java平台中的一种I/O处理方式,它提供了面向缓冲区的I/O处理机制,可以实现高性能、高效的I/O操作。 缓冲区(Buffer) 缓冲区是Java NIO中非常重要的一个概念,它...

    java_nio.rar_java nio

    缓冲区具有容量、位置和限制等属性,可以通过get和put方法进行数据读写。 3. **选择器(Selector)**:选择器允许单个线程检查多个通道上的事件,如连接请求、数据到达等,极大地提高了多路复用的能力。通过注册通道...

    Java-NIO2教程

    ### Java-NIO2教程知识点详解 #### I/O发展简史 - **JDK1.0-1.3**: 在此期间,Java的I/O模型主要依赖于传统的阻塞I/O方式,这种模式下,应用程序在等待I/O操作完成时无法执行其他任务,导致效率低下。此外,当时的...

    JAVANIO简介.pdf

    ### JAVANIO简介 #### 一、基本概念与传统IO 在计算机科学领域中,**IO(Input/Output)**是指主存与外部设备(如硬盘、终端、网络等)之间传输数据的过程。它是操作系统的一项核心功能,通过专用的I/O指令来实现。...

    Java NIO Buffer过程详解

    Java NIO Buffer 的主要方法: * allocate(): 创建一个新的 Buffer * put(): 将数据写入 Buffer * flip(): 将 Buffer 从写模式转换到读模式 * get(): 读取 Buffer 中的数据 * clear(): 清除 Buffer,为下次写入...

    nio

    - Java NIO中的通道类似于流(Stream),但是它支持与缓冲区(Buffer)交互,以及非阻塞模式。 2. **缓冲区(Buffer)**: - 用于在通道(Channel)和网络套接字(Socket)之间来来去去的数据是储存在缓冲区中的...

    Java NIO 主要类和方法(Java NIO中文版 附录C)

    在Java NIO中,Buffer类是所有其他缓冲类的基类,为所有缓冲器类型提供了通用方法。下面详细说明Java NIO中的主要类和方法。 Buffer类(C.1.1): Buffer类是一个抽象类,提供了缓冲区操作的基本结构。以下是一些...

    java nio入门学习,两个pdf

    Java NIO定义了多个Buffer类,如ByteBuffer、CharBuffer、IntBuffer等,每个Buffer都有容量、位置、限制等属性,可以进行读写操作。 3. **选择器(Selectors)**:选择器用于监控多个通道的状态,当某个通道准备就绪...

Global site tag (gtag.js) - Google Analytics