`

Java NIO学习笔记——ByteBuffer用法

    博客分类:
  • Java
阅读更多
package com.zhengtian.test;

import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;

/**
 * @author zhengtian
 * 
 * @date 2011-6-14 上午09:47:31
 */
@SuppressWarnings("all")
public class testNio {
	public static void main(String[] args) {
		/**
		 * 分配空间 隐含地在内存中分配了一个byte型数组来存储10个byte
		 */
		ByteBuffer buffer = ByteBuffer.allocate(10);
		/**
		 * 填充元素 buffer.hasRemaining()用于判断缓冲区是否达到上界limit。 该填充过程等效于:int remainCount = buffer.remaining();for (int j = 0; j < remainCount;
		 * j++){buffer.put((byte) j++);}
		 */
		int i = 0;
		while (buffer.hasRemaining()) {
			buffer.put((byte) i++);
		}
		/**
		 * 翻转缓冲区 将缓冲区进行翻转操作,即在缓冲区写入完毕时,将缓冲区翻转成一个准备读出元素的状态。 flip操作等效于buffer.limit(buffer.position()).position(0);同时将mark设为-1。 源码如下:public final Buffer
		 * flip(){ limit = position;position = 0;mark = -1;return this;}
		 */
		buffer.flip();
		/**
		 * 读取缓冲区
		 */
		int remainCount = buffer.remaining();
		for (int j = 0; j < remainCount; j++) {
			System.out.print(buffer.get() + " ");
		}
		System.out.println();

		/**
		 * 字节顺序
		 */
		System.out.println("ByteOrder的字节顺序为:" + ByteOrder.nativeOrder());
		System.out.println("ByteBuffer的字节顺序为:" + buffer.order());
		CharBuffer charBuffer = CharBuffer.allocate(10);
		System.out.println("CharBuffer的字节顺序为:" + charBuffer.order());
		// 修改ButyBuffer的字节顺序
		buffer.order(ByteOrder.LITTLE_ENDIAN);
		System.out.println("ByteBuffer的字节顺序为:" + buffer.order());

		/**
		 * 只有ByteBuffer可以创建直接缓冲区,用wrap函数创建的缓冲区都是非直接的缓冲区
		 */
		ByteBuffer redirectByteBuffer = ByteBuffer.allocateDirect(10);
		System.out.println("判断缓冲区是否为直接缓冲区:" + redirectByteBuffer.isDirect());

		/**
		 * 先创建一个大端字节顺序的ByteBuffer,然后再创建一个字符视图缓冲区
		 */
		ByteBuffer bigByteBuffer = ByteBuffer.allocate(7).order(ByteOrder.BIG_ENDIAN);
		CharBuffer viewCharBuffer = bigByteBuffer.asCharBuffer();
		/**
		 * 在字符视图的基础上创建只读字符视图
		 */
		CharBuffer onlyReadCharBuffer = viewCharBuffer.asReadOnlyBuffer();
		/**
		 * 创建一个与原始缓冲区相似的新缓冲区,两个缓冲区共享数据元素,拥有同样的容量,但每个缓冲区拥有各自的位置、上界、标记属性。 对一个缓冲区的数据元素所做的改变会反映在另一个缓冲区上,新的缓冲区会继承原始缓冲区的这些属性。
		 */
		CharBuffer copyCharBuffer = viewCharBuffer.duplicate();
		/**
		 * 创建原始缓冲区子集的新缓冲区
		 */
		CharBuffer cutCharBuffer = viewCharBuffer.slice();
	}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics