`

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和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    Java NIO学习笔记——ByteBuffer用法

    NULL 博文链接:https://zheng12tian.iteye.com/blog/1094811

    深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别

    NULL 博文链接:https://chinaestone.iteye.com/blog/468138

    JAVA NIO 学习资料

    JAVA NIO学习资料JAVA NIO学习资料

    java nio 包读取超大数据文件

    Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...

    Java NIO英文高清原版

    Java NIO英文高清原版

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

    Java NIO 主要类,包含类和函数,没有函数说明,类有简要说明

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java NIO 中文版

    讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用

    JAVA NIO 按行读取大文件支持 GB级别-修正版

    本类,是专门为了处理大文件,按行读取开发的类。 采用读文件的缓存 fbb 1024*5 行缓存 bb 256 字节 设计思想: 每次通过nio读取字节到 fbb中 然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 ...

    javaNIO学习笔记

    java NIO的基本知识点学习笔记,不包含具体代码

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    java nio 实现socket

    java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket

    java nio入门学习,两个pdf

    java nio入门学习,两个pdfjava nio入门学习,两个pdf

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    NIO(byteBuffer)按行读取文件

    使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com

    java学习笔记1(java io/nio)

    java学习笔记1(java io/nio)设计模式

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    java NIO.zip

    java NIO.zip

Global site tag (gtag.js) - Google Analytics