ByteBuffer使用

原创 2012年03月30日 22:50:36

在我们平时的程序开发过程中,当用到了byte[]之间的操作的时候我们最好是使用ByteBuffer,它为我们节省很多的空间,如下的实例,我需要把一个含有多个byte[]的类的属性都合并起来,此类如下所示:

public class MessageEntity {
	
	public MessageEntity() {
		super();
	}

	public MessageEntity(byte[] bodyTotalLengthDefine, byte[] commandId,
			byte[] messageBody, byte[] reserve, byte[] sequenceId, byte[] uuid) {
		super();
		body_total_length_define = bodyTotalLengthDefine;
		command_id = commandId;
		message_body = messageBody;
		this.reserve = reserve;
		sequence_id = sequenceId;
		this.uuid = uuid;
	}

	
	private byte[] body_total_length_define;

	
	private byte[] command_id;

	
	private byte[] message_body;

	
	private byte[] reserve;

	
	private byte[] sequence_id;

	
	private byte[] uuid;

}
 然后我现在要在一个方法中获取出这个类的一个实例的属性的byte[]的集合,这个时候我们可以有如下两种方式来实现此功能:
public static byte[] getMessageByte(MessageEntity message) {
		byte[] body_total_length_define = message.getBody_total_length_define();
		byte[] command_id= message.getCommand_id();
		byte[] message_body= message.getMessage_body();
		byte[] reserve= message.getReserve();
		byte[] sequence_id= message.getSequence_id();
		byte[] uuid= message.getUuid();
		
		int message_length = body_total_length_define.length+command_id.length+
		message_body.length+reserve.length+sequence_id.length+uuid.length;
		
		byte[] messageByte = new byte[message_length];
		
		System.arraycopy(body_total_length_define, 0, messageByte, 0, body_total_length_define.length);
		System.arraycopy(command_id,   0,  messageByte, body_total_length_define.length, command_id.length);
		System.arraycopy(message_body, 0,  messageByte, body_total_length_define.length+command_id.length, message_body.length);
		System.arraycopy(reserve,      0,  messageByte, body_total_length_define.length+command_id.length+message_body.length, reserve.length);
		System.arraycopy(sequence_id,  0,  messageByte, body_total_length_define.length+command_id.length+message_body.length+reserve.length, sequence_id.length);
		System.arraycopy(uuid,  0,  messageByte, body_total_length_define.length+command_id.length+message_body.length+reserve.length+sequence_id.length, uuid.length);
		return messageByte;
	}

我们还可以使用ByteBuffer来实现这一功能:

public static byte[] getMessageByte1(MessageEntity message) {
		byte[] body_total_length_define = message.getBody_total_length_define();
		byte[] command_id= message.getCommand_id();
		byte[] message_body= message.getMessage_body();
		byte[] reserve= message.getReserve();
		byte[] sequence_id= message.getSequence_id();
		byte[] uuid= message.getUuid();
		
		int message_length = body_total_length_define.length+command_id.length+
		message_body.length+reserve.length+sequence_id.length+uuid.length;
		
		ByteBuffer bf = ByteBuffer.allocate(message_length);
		bf.put(body_total_length_define);
		bf.put(command_id);
		bf.put(message_body);
		bf.put(reserve);
		bf.put(sequence_id);
		bf.put(uuid);
		
		return bf.array();
	}
 两种方式的复杂程度相比差异很大,第一种方式非常的繁琐,代码非常多,因此容易出现错误,而且效率又低,占用的内存又多,而第二种方式则相对简单很多,只需要为ByteBuffer赋好了初始值,然后把数组向里面put就完了,非常简单,效率当然更高,因为它的整个过程中就只是使用了一个ByteBuffer对象,而上一个方法里面则生成了好多对象,占内存大,效率低,因此第二种是最佳的方式。





                    
版权声明:本文为博主原创文章,未经博主允许不得转载。

java.nio.ByteBuffer的flip、rewind和compact几个方法的区分使用

java.nio.ByteBufferCapacity 缓冲区最大容量 Limit 当前最大使用量,或者说是有效数据的EOF位置。Position 指向当前位置的指针假设一个缓冲区容量是10,开始指...

ByteBuffer使用总结

FW:http://blog.csdn.net/baple/article/details/12749005 目录:[ - ] 概述使用ByteBuffer内部字段byte[]...

关于ByteBuffer使用解释

转自http://blackbeans.iteye.com/blog/836103 之前看过相关的ByteBuffer的使用,但是问题是那时还年轻,所以现在有点老了,因此,忘记了,所以决心看源代...

ByteBuffer使用详解

position测试:  Java代码   ByteBuffer bb = ByteBuffer.allocate(10);   System.out.println("起始...

ByteBuffer使用总结

在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素...

byteBuffer的使用之道

缓冲区分配和包装 在能够读和写之前,必须有一个缓冲区,用静态方法 allocate() 来分配缓冲区: ByteBuffer buffer = ByteBuffer.allocate(...
  • eddle
  • eddle
  • 2011年11月08日 22:28
  • 11512

ByteBuffer使用记录

在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问 NIO 中的数据,都是将它放到缓冲区中。缓冲区实质上是一个数组。通...

从头认识java-16.4 nio的读与写(ByteBuffer的使用)

这一章节我们来讨论一下nio的读与写。1.nio的读package com.ray.ch16; import java.io.IOException; import java.io.RandomAc...

使用byteBuffer的 position和limit方法分段读取字节流

1.byteBuffer几个方法含义:         capacity:缓冲区的容量;   limit:缓冲区还有多少数据能够取出或者缓冲区还有多少容量用于存放数据;   pos...

java.nio.ByteBuffer的flip、rewind和compact几个方法的区分使用 (转载)

java.nio.ByteBuffer ------------------------------- Capacity 缓冲区最大容量 Limit 当前最大使用量,或者说是有效数据的EOF位置...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ByteBuffer使用
举报原因:
原因补充:

(最多只允许输入30个字)