​ Java NIO中的缓存区(Buffer)用于和通道(Channel)进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。

​ 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。

Buffer底层使用数组实现。


1、NIO 数据读取基本操作示意

2、Java NIO中Buffer类型

​ Java NIO中,根据数据类型不同(boolean 除外),提供了相应类型的缓冲区:

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer


3、Buffer的基本用法

​ 使用Buffer读写数据一般遵循以下四个步骤:

​ 写入数据到Buffer;

​ 调用flip()方法;

​ 从Buffer中读取数据;

​ 调用clear()方法或者compact()方法;

​ 当向buffer写入数据时,buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。

​ 一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。

String str = "charBuffer";
CharBuffer charBuffer = CharBuffer.allocate(1024);
charBuffer.put(str);
charBuffer.append("--");
charBuffer.append("hello world"); charBuffer.flip(); //单个读取buffer中的内容
/*while (charBuffer.hasRemaining()) {
System.out.println(charBuffer.get());
}*/ //一次性读取buffer中的内容
char[] dst = new char[charBuffer.limit()];
charBuffer.get(dst);
System.out.println(new String(dst));

4、Buffer属性与方法详解

4.1、基本属性
public abstract class Buffer {
// Invariants: mark <= position <= limit <= capacity
private int mark = -1;//标记位置
private int position = 0;//当前游标位置
private int limit;//可读取数据大小
private int capacity;//buffer容量大小
...
}

4.2、常用方法
4.2.1、mark()

标记当前位置,配合reset使用。

public final Buffer mark() {
mark = position;
return this;
}
4.2.2、reset()

重置游标为标记位。

public final Buffer reset() {
int m = mark;
if (m < 0)
throw new InvalidMarkException();
position = m;
return this;
}
4.2.3、clear()

清除缓冲区,等待写入。

public final Buffer clear() {
position = 0;
limit = capacity;
mark = -1;
return this;
}
4.2.4、flip()

将缓冲区由写模式切换为读模式。

public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
4.2.5、rewind()

重置buffer,等待写入。

public final Buffer rewind() {
position = 0;
mark = -1;
return this;
}
4.2.6、remaining()

获取剩余可读元素个数。

public final int remaining() {
return limit - position;
}
4.2.7、hasRemaining()

判断是否还有可读元素。

public final boolean hasRemaining() {
return position < limit;
}

Java NIO之Buffer(缓冲区)的更多相关文章

  1. Java NIO 之 Buffer(缓冲区)

    一 Buffer(缓冲区)介绍 Java NIO Buffers用于和NIO Channel交互. 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels. Bu ...

  2. Java NIO中的缓冲区Buffer(一)缓冲区基础

    什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的 ...

  3. Java NIO 之 Buffer

    Java NIO 之 Buffer Java NIO (Non Blocking IO 或者 New IO)是一种非阻塞IO的实现.NIO通过Channel.Buffer.Selector几个组件的协 ...

  4. JAVA NIO简介-- Buffer、Channel、Charset 、直接缓冲区、分散和聚集、文件锁

    IO  是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. Java标准io回顾 在Java1.4之前的I/O系统中,提供 ...

  5. Java NIO中的缓冲区Buffer(二)创建/复制缓冲区

    创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1.调用allocate方法 2.调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义: allocate方法创建缓冲区 调用all ...

  6. 【Java nio】buffer

    package com.slp.nio; import org.junit.Test; import java.nio.ByteBuffer; /** * Created by sanglp on 2 ...

  7. java nio之Buffer

    一.JAVA NIO 是在和channel交互的时候使用的.Channel将数据读入缓冲区,然后我们又从缓冲区访问数据.写数据时,首先将要发送的数据按顺序填入缓冲区.基本上,缓冲区只是一个列表,它的所 ...

  8. Java NIO:Buffer、Channel 和 Selector

    Buffer 一个 Buffer 本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据. java.nio 定义了以下几个 Buffer 的实现,这个图读者应该也在不少地方见过了吧 ...

  9. Java NIO(2):缓冲区基础

    缓冲区(Buffer)对象是面向块的I/O的基础,也是NIO的核心对象之一.在NIO中每一次I/O操作都离不开Buffer,每一次的读和写都是针对Buffer操作的.Buffer在实现上本质是一个数组 ...

随机推荐

  1. 说说基于网络的五种IO模型

    # django不是一个异步框架 # tornado是异步的web框架 # 处理每秒大量的请求 # 个人理解的IO:就是应用层与内核驱动层的交互,这个过程无论从应用层到内核中,还是驱动层等待硬件层的数 ...

  2. 链表(LinkedList)解题总结

    链表基础知识 定义 链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer). 链表的操作 操作 ...

  3. 前端web安全-CSRF基础入门

    前言 今天找了个新地方进行学习 嘿嘿  采光不错!特别适合看书呢. 前言 1.CSRF 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click att ...

  4. 深度分析:那些Java中你一定遇到过的问题,一次性帮你搞定!深度分析:那些Java中你一定遇到过的问题,一次性帮你搞定!

    1.java中==和equals和hashCode的区别 基本数据类型的比较的值相等.类的比较的内存的地址,即是否是同一个对象,在不覆盖equals的情况下,同比较内存地址,原实现也为 == ,如St ...

  5. 系统兼容软件CrossOver和虚拟机软件,哪个好用?

    想要在Mac上运行Windows软件的方法有很多种,比较常见的有安装双系统以及虚拟机.但是安装双系统会导致一个很大的问题,就是占用了过多的硬盘空间,这样一来会导致可使用的空间减少. 目前来说,大家都不 ...

  6. jQuery 第七章 实例方法 位置图形

    位置坐标图形大小相关方法: .offset() .position() .scrollTop() .scrollLeft() .width() .height() .innerWidth() inne ...

  7. vulnhub: DC 9

    信息收集: root@kali:/opt/test# nmap -A -v 192.168.76.137 Starting Nmap 7.80 ( https://nmap.org ) at 2020 ...

  8. linux配置tomcat项目包

    安装配置tomcat 操作系统:  centos 7.1 使用模式:命令模式 使用工具:xshell5 .xftp5 注意之前有配置过tomcat需要进行以下4个步骤 1.关闭网管服务 输入命令: 进 ...

  9. So Easy! HDU - 4565

    易知,有\(S_n = \lceil{a + \sqrt{b}}\rceil ^ n\) \(\because a ^ 2 - 1 < b < a ^ 2\) \(\therefore a ...

  10. 三:robot framework常用关键字

    该部分介绍的是内置库:Builtin,估不需要导入,即可使用 1.RF中定义一个变量: ${XXX}   XXX表示:变量名 *** Settings *** *** Test Cases *** 定 ...