问题
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());
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?
回答1:
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.
回答2:
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();
回答3:
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
.
回答4:
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 yourbyte[]
putInt(int value)
- and
byte[] array()
to get the content
回答5:
You don´t need more like this
Example exampleExample = method(example);
ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos);
Message message = MessageBuilder.withBody(baos.toByteArray()).build();
回答6:
The Integer class has a method to get the byte value of an int. Integer.byteValue()
来源:https://stackoverflow.com/questions/2984538/how-to-use-bytearrayoutputstream-and-dataoutputstream-simultaneously-java