2014-01-17 3 views
5

Я пытаюсь найти простой способ создания изменяемого байтового массива, который может автоматически добавлять любой примитивный тип данных Java. Я искал, но не мог найти ничего полезного.Структура данных изменяемого байтового массива Java

Я ищу что-то вроде этого

ByteAppender byteStructure = new ByteAppender(); 
byteStructure.appendInt(5); 
byteStructure.appendDouble(10.0); 

byte[] bytes = byteStructure.toByteArray(); 

Существует ByteByffer, который является большим, но вы должны знать размер буфера перед тем, как начать, что не будет работать в моем случае. Существует аналогичная вещь (StringBuilder) для создания строк, но я не могу найти ее для Bytes.

Я думал, что это будет очевидно на Java.

+2

Почему вы не можете использовать 'ArrayList ' и использовать' .toArray() 'впоследствии? –

+0

@JoshM, скорость в основном. У меня есть набор упорядоченных элементов, и для примитивных типов я просто использую их байты. Но для строк мне нужно вычислить их длину и преобразовать их в массив байтов. Если мне сначала нужно вычислить размер массива байтов, тогда я должен дважды перебирать список, вычисляя размер на первом проходе, а затем переводить на второй. – Jason

+0

@JeroenVannevel, ArrayList не принимает примитивные типы в качестве входных данных, поэтому мне пришлось бы постоянно делать что-то вроде этого: 'ByteBuffer.allocate (4) .putInt (yourInt) .array();', а затем 'for (Byte b: bytes) arrayBytes.add (b); '. Это выполнимо, но очень грязно. – Jason

ответ

12

Я предполагаю, что вы ищете java.io.DataOutputStream

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
DataOutputStream dout = new DataOutputStream(out); 
dout.writeInt(1234); 
dout.writeLong(123L); 
dout.writeFloat(1.2f); 
byte[] storingData = out.toByteArray(); 

Как использовать storingData?

//how to use storingData? 
ByteArrayInputStream in = new ByteArrayInputStream(storingData); 
DataInputStream din = new DataInputStream(in); 
int v1 = din.readInt();//1234 
long v2 = din.readLong();//123L 
float v3 = din.readFloat();//1.2f 
+0

Отлично. Именно то, что я искал. – Jason

+0

PS не забудьте закрыть – Jason