views:

68

answers:

5

Hi! I'm having quite a problem here, and I think it is because I don't understand very much how I should use the API provided by Java.

I need to write an int and a byte[] into a byte[]

I thought of using a DataOutputStream to solve the data writing with writeInt(int i) and write(byte[] b), and to be able to put that into a byte array, I should use ByteArrayOutputStream's method toByteArray().

I understand that this classes use the Wrapper pattern, so I had two options:

DataOutputStream w = new DataOutputStream(new ByteArrayOutputStream());

or

ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream());

but in both cases, I "loose" a method. in the first case, I can't access the toByteArray method, and in the second, I can't access the writeInt method.

How should I use this classes together?

+6  A: 

Like this:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream w = new DataOutputStream(baos);

w.writeInt(100);
w.write(byteArray);

w.flush()

byte[] result = baos.toByteArray();

Actually your second version will not work at all. DataOutputStream requires an actual target stream in which to write the data. You can't do new DataOutputStream(). There isn't actually any constructor like that.

Toader Mihai Claudiu
I've always wondered, is there really I reason to flush a wrapped `ByteArrayOutputStream`?
Justin
there isn't but you never know the behaviour of a wrapper. It could actually buffering something so I flush the wrapper by habit :). If it's a pass-thru wrapper it shouldn't hurt.
Toader Mihai Claudiu
A: 

Use the former case - wrap DataOutputStream around the ByteArrayOutputStream. Just make sure you save the reference to the ByteArrayOutputStream. When you are finish close() or at least flush() the DataOutputStream and then use the toByteArray method of the ByteArrayOutputStream.

GregS
A: 

The Integer class has a method to get the byte value of an int. Integer.byteValue()

Rulmeq
A: 

You could use a stream approach if you connect your outputstream to an inputstream through a PipedInputStream/PipetOutputStream. Then you will consume the data from the inputstream.

Anyway if what you need to do is simple and doesn't not require a stream approach I would use a java.nio.ByteBuffer on which you have

  • put(byte[] src) for your byte[]
  • putInt(int value)
  • and byte[] array() to get the content
Jack
+1  A: 

Could you make a variable to hold on to the ByteArrayOutputStream and pass it into the DataOutputStream.

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(1);
byte[] result = dos.toByteArray();
Yack