`

(二)NIO-Buffer

    博客分类:
  • NIO
阅读更多
参考教程:http://ifeve.com/buffers/
一、buffer

缓冲区即在内存中开辟的一段连续的存储空间,用于临时存放数据

1.基本概念
capacity:容量,一旦创建,不可修改
limit:限制位;
position:位置符号
写操作:limit = capacity ; position = {0,capacity-1} 即 positon < limit
读操作:limit = position (停止写入数据时的position位置,表示当前可读取的内容的最大长度),position = 0 (从缓冲区开始位置读取内容)
mark:标记位,默认值-1

2.创建
		// 1.创建空缓冲区,设置容量大小,单位字节,如:1024B = 1KB
		ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
		// 2.根据已有内容,创建缓冲区
		// capacity = byte[].length
		// position = 0 
		// mark = -1
		// limit = position + length = capacity
		ByteBuffer byteBuffer1 = ByteBuffer.wrap("abc".getBytes());


3.写入

		// capacity = 1024
		// position = 3 ,写入数据时position从0开始,写入一个,position下移一位
		// mark = -1
		// limit = 1024
		byteBuffer.put("abc".getBytes());


若此时读取数据
		System.out.println("try to get from buffer");
		System.out.println(byteBuffer.get());


结果:0
原因在于读取数据时根据读取positon位置处的值,此时position=3指向一个未写入数据的位置,0为默认值

4.写转读

		// 1.变更 limit ,limit的值为当前允许读取的最大长度位置即写入数据
		// limit = position 当前的position位置
		// 2.变更 position ,读取数据应从 position = 0 从头读取
//		byteBuffer.limit(byteBuffer.position());
//		byteBuffer.position(0);
		byteBuffer.flip();


5.读取

		// 已写入数据的个数
//		byteBuffer.limit() - byteBuffer.position();
//		byteBuffer.remaining() > 0;
//		byteBuffer.hasRemaining() ==》 limit - position
		while(byteBuffer.hasRemaining()){
			byte b = byteBuffer.get();
			System.out.println((char)b);
		}


6.清空

读取数据后,清空已有数据,重新写入

		// clear 清空缓冲区,实质,缓冲区中的内容并未被清空,只是做了一些看似清空缓冲区的操作
		// 将 position = 0 ,limit = capacity 即	相当于初始化了缓冲区
		// 即,所谓的清空缓冲区,是靠重新写入的数据覆盖完成的
		// 又因为 position < limit ,所以在覆盖的情况下也只能读取到覆盖后的内容,读取不到未覆盖的内容
		// 故感觉上是缓冲区清空了
		byteBuffer.clear();
		
		// 1.初始化时,写入"abc" 三个字符,现写入"xy"两个字符,强制获取第2(因为position是从0开始计数)个位置的数据
		// 2.获取到的数据内容为 c ,说明,clear 并未清空缓冲区
		byteBuffer.put("xy".getBytes());
		byte result = byteBuffer.get(2);
		System.out.println((char)result);


7.标记

		byteBuffer.put("def".getBytes());
		byteBuffer.flip();
		// 此时缓冲区里面的内容为:"xydef"
		System.out.println((char)byteBuffer.get());
		// 在第二个字符处,即position=1的位置做标记,mark = 1
		byteBuffer.mark();
		System.out.println("======get======");
		while(byteBuffer.hasRemaining()){
			System.out.println((char)byteBuffer.get());
		}
		
		System.out.println("======reset======");
		// 重置 position = mark 
		byteBuffer.reset(); 
		while(byteBuffer.hasRemaining()){
			System.out.println((char)byteBuffer.get());
		}


8.重读

		// 重新读取数据
		// position = 0 , mark = -1
		byteBuffer.rewind();
		while(byteBuffer.hasRemaining()){
			System.out.println((char)byteBuffer.get());
		}


9.清空已读内容,保留未读内容

		// compact 将未读取内容,重置到缓冲区起始位置,再次写入内容时从未读数据的最后一个位置开始写入
		byteBuffer.rewind();
		for(int i = 0 ; i < 2 ; i ++){
			System.out.println((char)byteBuffer.get());
		}
		byteBuffer.compact();
		byteBuffer.put("hij".getBytes());
		byteBuffer.rewind();
		System.out.println("compact");
		while(byteBuffer.hasRemaining()){
			System.out.println((char)byteBuffer.get());
		}
		// 输出 defhij
分享到:
评论

相关推荐

    Java NIO实战开发多人聊天室

    12-Java NIO-Buffer-概述.mp4 13-Java NIO-Buffer-基本使用.mp4 14-Java NIO-Buffer-三个属性和类型.mp4 17-Java NIO-Buffer-缓冲区分片.mp4 18-Java NIO-Buffer-只读缓冲区.mp4 19-Java NIO-Buffer-直接缓冲区.mp4 ...

    httpcore-nio-4.3.jar包

    NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。通道可以读写数据,缓冲区用于临时存储数据,选择器则用于监听多个通道的事件,实现了多路复用,从而实现非阻塞I/O。 3. **HttpCore NIO...

    java网络编程NIO视频教程

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

    基于matrix-nio和nio-template构建的管理员和个人协助.zip

    3. **Buffer**:缓冲区用于存储数据,NIO中的缓冲区提供了更高效的数据存取方式。 4. **Pipe**:管道用于在两个线程之间传递数据,通常用于服务器内部通信。 5. **ServerSocketChannel** 和 **SocketChannel**:分别...

    JAVA-NIO-DEMO

    - **Buffer操作**:展示如何创建、填充、清空和读取缓冲区,以及如何使用`flip()`、`clear()`和`compact()`方法管理缓冲区状态。 - **选择器使用**:通过Selector监听多个通道的就绪状态,实现多路复用,提高程序...

    android-socket-nio-master.zip

    4. **Buffer缓冲区**:NIO中的Buffer类用于在Java内存和操作系统之间交换数据。开发者需要掌握如何正确地使用Buffer读写数据,以确保高效的数据传输。 5. **事件驱动编程**:NIO基于事件驱动模型,需要编写处理各种...

    socket-nio-single-reactor.zip

    5. **Buffer**:NIO中的缓冲区,用于存储和传输数据。Buffer提供了一种高效的方式来读写数据,减少了不必要的内存复制。 6. **EventLoop**:单Reactor模式中,只有一个事件循环来处理所有的I/O事件。所有注册到...

    Java-NIO-系列教程

    除了以上提到的 Buffer 类型之外,Java NIO 还提供了一个特殊的 Buffer 类型——`MappedByteBuffer`,用于表示内存映射文件。这种方式能够提高文件的读写效率,但由于其实现较为复杂,本概述中不做详细介绍。 #### ...

    Java-NIO-Programming-Cookbook(含源码)

    `DirectByteBuffer`是`ByteBuffer`的一个实现,它与`Non-Direct Buffer`(即堆缓冲区)有所不同。直接缓冲区在Java中使用JNI(Java Native Interface)直接在物理内存中分配,而不需要经过Java堆,这通常能提高性能...

    bio-nio-aio.zip

    二、非阻塞IO(NIO) 为了解决BIO在高并发下的问题,Java引入了NIO(New IO)。NIO基于通道(Channel)和缓冲区(Buffer)进行数据传输,且提供了选择器(Selector)来监听多个通道的事件,实现了一对多的模型。这样,...

    NIO详细介绍channle,buffer,Selector

    ### NIO:Channel、Buffer与Selector详解 #### 一、NIO概述 NIO(Non-blocking I/O,非阻塞I/O)是Java为了解决传统阻塞式I/O效率低下的问题而引入的一种新的I/O操作模式。NIO通过引入Channel、Buffer以及Selector...

    【IT十八掌徐培成】Java基础第27天-03.NIO-Selector.zip

    在Java NIO中,Selector与Channel、Buffer等组件一起,构建了一个强大的非阻塞I/O框架,为开发高性能的网络应用提供了强大的支持。 本教程“Java基础第27天-03.NIO-Selector.avi”应该会详细讲解这些概念,并通过...

    Java中的IO与NIO-jiava求职面试-15题,答案

    NIO基于通道(Channel)和缓冲区(Buffer),而非传统的流。通道可以从源头获取数据并将其写入目标,而缓冲区则作为数据的临时存储区域。NIO支持阻塞和非阻塞两种模式。在非阻塞模式下,用户线程可以不等待数据准备...

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

    这个压缩包“动态演示nio中的buffer相关操作.zip”显然是为了帮助用户直观地理解NIO Buffer的工作机制,通过动态演示来展示Buffer如何存储、读取和传输数据。 在Java NIO中,Buffer是一个特定类型的数组,用于临时...

    JAVA IO and NIO

    3. **内存直接访问(Direct Buffer)**:NIO支持直接在操作系统内存中创建缓冲区,减少了数据复制带来的开销。 在实现客户端与服务器通信时,Java IO通常通过Socket类进行。客户端创建Socket实例连接到服务器,...

    nio-study:尼奥研究

    2. **缓冲区(Buffers)**:缓冲区是NIO中数据操作的主要对象,所有类型的Java原始类型都有对应的Buffer类,如ByteBuffer、CharBuffer等。数据在进行I/O操作时会先被存入缓冲区,然后从缓冲区读取或写入。 3. **...

    nio-2015:NIO 2015 第二轮——我的解决方案

    1. **非阻塞I/O(NIO)基础**:理解Java的Channel、Buffer和Selector等核心组件,以及它们如何协同工作来实现非阻塞的数据传输。 2. **Java NIO API**:学习如何使用java.nio包下的类和接口,如FileChannel、...

    JavaCore-NIO-Multi-user-Chat

    5. **缓冲区(Buffer)**:在NIO中,数据不是直接在通道和应用程序之间传输,而是通过缓冲区进行。数据先读入缓冲区,然后再从缓冲区写入另一个通道或应用程序。 6. **多路复用器(Multiplexer)**:在Java中,选择...

    javasnmp源码-nio-learn:JavaNIO使用示例,NIO的使用,TCP,UDP的简单示例

    Buffer是数据的容器,在nio中负责数据的存取,java为不同数据类型提供了相对应的缓冲区类型 如:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 、DoubleBuffer 等。 Buffer的基本使用 ...

Global site tag (gtag.js) - Google Analytics