Take the 2-minute tour ×

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 method toByteArray().

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

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


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?

share|improve this question
add comment

5 Answers

up vote 17 down vote accepted

Like this:

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



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.

share|improve this answer
I've always wondered, is there really I reason to flush a wrapped ByteArrayOutputStream? –  Justin Jun 6 '10 at 14:49
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. –  Mihai Claudiu Toader Jun 6 '10 at 17:37
can you declare the byteArray variable? and what actually w.write(byteArray); do? –  Keenan Gebze Jun 30 '12 at 1:49
ah its working now, there is some problem on my hex editor (i wrote it to file just to prove it and it works) –  Keenan Gebze Jun 30 '12 at 2:00
add comment

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);
byte[] result = dos.toByteArray();
share|improve this answer
add comment

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.

share|improve this answer
add comment

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
share|improve this answer
add comment

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

share|improve this answer
add comment

Your Answer


