`

Java Nio ByteBuffer 类学习笔记

    博客分类:
  • java
 
阅读更多

最近对VAS中的socket 中的包头从16位调整为32位,此调整涉及到了Nio ByteBuffer 。

 * capacity:指buffer最大能放大少数据,此一般在buffer在创建时被指定
 * limit:指buffer在进行读写操作时,不能超过此下标,在写时limit 与 capacity一般相等,当读数据时,limit为有效数据的长度。
 * position:指操作的当前下标 可以理解为指针,读写一个数据,指针下移
 * mark:指临时存放下标的指,当进行mark()操作时,mark会保存position的值,当进行reset()操作时,又把mark的指赋予position值  ,mark的值总是小于等于position的值。
 * flip: 把limit设置为当前position,同时把position设置为0 在读出数据前调用  即把指针放到开始位置,读数据时只读到限制位置
 * compact:把当前从position位置到limit位置的字节移动到从0开始
 * clear:重置了缓冲区的主要索引值.不必为了每次读写都创建新的缓冲区,那样做会降低性能
 
  0 <= mark <= position <= limit <= capacity
  存在的疑问:mark() ,reset()  方法,在代码测试中,测试不出使用mark,reset方法的场景,不知是如何使用??
package com.binary;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;


public class ByteBufferTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ByteBuffer bb = ByteBuffer.allocate(8);
		ByteBuffer ccBuffer = ByteBuffer.allocate(8);
		String infoString = "";
		String testStrString = "wuxhtest";
		bb = ByteBuffer.wrap(testStrString.getBytes());
		byte[] tmp = new byte[8];
		tmp = bb.array();
		System.out.println("length:" + testStrString.length() + "    "
				+ new String(tmp));
		log("当字节数组包装后", bb);

		// 读ByteBuffer的数据
		System.out.println((char) bb.get());
		System.out.println((char) bb.get());
		log("get读取数据后", bb);
		bb.mark();
		log("mark标记后", bb);
		// bb.flip();
		// log("flip后", bb);
		System.out.println((char) bb.get());
		System.out.println((char) bb.get());
		log("get读取数据后", bb);
		bb.reset();
		log("reset后", bb);

		// 把limit设为当前position,把position设为0,一般在从Buffer读出数据前调用。
		bb.flip();
		log("flip后", bb);
		bb.compact();
		log("compact后", bb);
		// 放入数据
		bb.put((byte) 12);
		try {
			log("put 放入数据   " + new String(bb.array(), "GBK"), bb);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		bb.clear();
		log("clear后", bb);
	}

	public static void log(String info, ByteBuffer bb) {
		System.out.println("info:" + info + ":   position:" + bb.position()
				+ " limit:" + bb.limit() + " capacity:" + bb.capacity()
				+ " mark:" + bb.mark());
	}

}
    执行结果:
   
写道
length:8 wuxhtest
info:当字节数组包装后: position:0 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]
w
u
info:get读取数据后: position:2 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=2 lim=8 cap=8]
info:mark标记后: position:2 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=2 lim=8 cap=8]
x
h
info:get读取数据后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:reset后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:flip后: position:0 limit:4 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=4 cap=8]
info:compact后: position:4 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=4 lim=8 cap=8]
info:put 放入数据 wuxhest: position:5 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=5 lim=8 cap=8]
info:clear后: position:0 limit:8 capacity:8 mark:java.nio.HeapByteBuffer[pos=0 lim=8 cap=8]
 
 
 
分享到:
评论

相关推荐

    Java NIO学习笔记——ByteBuffer用法

    ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。ByteBuffer是一个字节缓冲区,可以存储字节序列。在NIO中,所有的数据读写都通过缓冲区进行,ByteBuffer与其他类型的Buffer...

    javaNIO学习笔记

    ### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...

    JAVA NIO学习笔记.docx

    import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class CopyFile { public static void main(String[] args) throws Exception { String infile = "C:\\copy.sql"; String ...

    java NIO学习系列 笔记

    Java NIO(New Input/Output)是Java标准库在JDK 1.4版本中引入的一个新特性,它提供了一种不同于传统IO流的高效I/O处理方式。NIO的核心概念包括通道(Channel)和缓冲区(Buffer),这两个组件使得数据以块的形式...

    阿里P8 架构师整理Java学习笔记.pdf

    ### Java学习笔记知识点总结 #### 一、JVM与内存管理 **1.1 JVM基本概念** - **JVM(Java Virtual Machine)**: Java虚拟机是执行Java字节码的虚拟机,它提供了运行Java程序所需的环境。 **1.2 线程** - **线程...

    NIO学习笔记

    《NIO学习笔记》 在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,与传统的BIO(Blocking I/O)相对应。NIO提供了一种新的方式来处理I/O操作,特别是在处理大量并发连接时,它的...

    学习笔记 java\CoreJava笔记\CoreJava_day21

    在`CoreJava_day21`的学习笔记中,主要探讨了Java中的NIO(New I/O)包及其关键类和接口,包括`ByteBuffer`、`FileChannel`以及网络编程中常用的`ServerSocket`和`Socket`等。NIO自JDK 1.4引入以来,因其高效性和...

    mina2资料-各种教程

    了解以上知识点是掌握Apache MINA的基础,通过提供的学习资料,如《Mina2.0学习笔记》、《Apache MINA入门基础》和《Apache MINA Server 2.0中文参考手册》等,可以深入学习MINA的API用法、设计原理和最佳实践。...

    nio相关知识学习

    Buffer是存储数据的容器,Java NIO提供了一系列不同类型的Buffer,如ByteBuffer、CharBuffer、IntBuffer等,它们都继承自抽象类Buffer。Selector允许单线程监控多个通道的事件,提高了程序的并发性能。 1. Channel...

    java常用工具类整理

    3. **java.nio.*** 包:非阻塞I/O模型,提供更高效的IO操作,如`ByteBuffer`、`Channels`和`Selectors`。 4. **java.lang.reflect.*** 包:反射机制,允许运行时动态访问和修改类、接口、字段和方法。这对于实现元...

    mina学习笔记,记录所有API

    在MINA的学习笔记中,记录的所有API通常会包括以下几个核心部分: 1. **IoSession**: 这是MINA的核心接口,代表了客户端和服务器之间的连接。IoSession提供了读写数据、管理连接状态、获取会话属性等功能。例如,`...

    Apache mina2学习笔记DEMO

    在这个"Apache MINA2学习笔记DEMO"中,我们很可能会看到如何使用MINA来创建一个自定义协议的示例。自定义协议通常是为了满足特定应用的需求,例如高效的数据传输、安全性或者特定的编码格式。MINA允许开发者定义自己...

    Mina2.0阅读源码笔记(很值得一看)

    - IoBuffer 是 Mina 中用于数据存储和传输的核心类,它是对 Java NIO ByteBuffer 的封装和增强。 - **IoBuffer vs ByteBuffer**: IoBuffer 提供了更多便于操作的功能,比如自动扩容、直接内存分配等特性,使得数据...

    基于Netty网络编程项目实战笔记.rar

    Netty提供了ByteBuf作为Java NIO ByteBuffer的替代品,提供更高效的内存管理和操作。ByteBuf支持预读和后写,可以避免不必要的内存复制,提高数据传输效率。 此外,Netty的编码解码器(Encoder和Decoder)机制简化...

    自动netty笔记111

    这个“自动Netty笔记111”可能是某个开发者或学习者记录的一系列关于Netty学习过程中的关键点和理解。下面将详细阐述Netty的相关知识点。 1. **异步事件驱动模型**: Netty采用了非阻塞I/O模型,基于Java NIO(Non...

    learning-netty.zip

    - **ByteBuf**: Netty的高效字节缓冲区,优于Java NIO的ByteBuffer,提供了更友好的API和更好的性能。 - **Pipeline**: 事件处理链,负责在Channel中调度和执行各种I/O操作,每个Handler都可以处理特定的事件。 -...

    netty资料.rar

    这个“netty资料.rar”压缩包文件包含了关于Netty的学习笔记,可以帮助我们深入了解Netty的核心概念和使用技巧。 Netty 的主要特点包括: 1. **异步事件驱动**:Netty 使用了非阻塞I/O模型,基于Java NIO(非阻塞...

    Netty源码分析总结.rar

    4. **ByteBuf**:Netty自定义的内存管理工具,相比Java的ByteBuffer更高效,支持零拷贝,提供了读写缓冲区的操作。 5. **EventLoop与EventLoopGroup**:EventLoop是处理I/O事件的线程,EventLoopGroup是一组Event...

Global site tag (gtag.js) - Google Analytics