如何同时使用ByteArrayOutputStream和DataOutputStream(Java)

时间:2010-06-06 14:32:26

标签: java wrapper bytearrayoutputstream dataoutputstream

我在这里遇到了很多问题,我认为这是因为我不太了解如何使用Java提供的API。

我需要将intbyte[]写入byte[]

我想使用DataOutputStream来解决使用writeInt(int i)write(byte[] b)的数据写入,并且为了能够将其放入字节数组中,我应该使用{{1}方法ByteArrayOutputStream

我知道这些类使用Wrapper模式,所以我有两个选择:

toByteArray().

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

但在这两种情况下,我都“松散”了一种方法。在第一种情况下,我无法访问ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream()); 方法,而在第二种情况下,我无法访问toByteArray()方法。

我应该如何一起使用这些课程?

6 个答案:

答案 0 :(得分:38)

像这样:

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

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

w.flush();

byte[] result = baos.toByteArray();

实际上你的第二个版本根本不起作用。 DataOutputStream需要一个实际的目标流来写入数据。你做不到new DataOutputStream()。实际上并没有像这样的构造函数。

答案 1 :(得分:2)

您是否可以创建一个变量来保留ByteArrayOutputStream并将其传递给DataOutputStream。

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

答案 2 :(得分:1)

使用前一种情况 - 围绕DataOutputStream包裹ByteArrayOutputStream。只需确保将引用保存到ByteArrayOutputStream即可。当你完成close()或至少flush()DataOutputStream然后使用ByteArrayOutputStream的toByteArray方法时。

答案 3 :(得分:1)

如果您通过PipedInputStream / PipetOutputStream将输出流连接到输入流,则可以使用流方法。然后,您将使用输入流中的数据。

无论如何,如果您需要做的事情很简单并且不需要流方法,我会使用您拥有的java.nio.ByteBuffer

  • put(byte[] src)代表byte[]
  • putInt(int value)
  • byte[] array()获取内容

答案 4 :(得分:1)

你不需要更多这样的

Example exampleExample = method(example); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos);
Message message = MessageBuilder.withBody(baos.toByteArray()).build();

答案 5 :(得分:0)

Integer类有一个获取int的字节值的方法。 Integer.byteValue()