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

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

我需要将一个int和一个byte[]写入一个byte[]

我想过使用DataOutputStream来解决使用writeInt(int i)write(byte[] b)的数据写入,并且为了能够将它放入一个字节数组,我应该使用ByteArrayOutputStream方法toByteArray().

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

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

要么

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

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

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

喜欢这个:

 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream w = new DataOutputStream(baos); w.writeInt(100); w.write(byteArray); w.flush(); byte[] result = baos.toByteArray(); 

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

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

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

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

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

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

  • put(byte[] src)为你的byte[]
  • putInt(int value)
  • byte[] array()来获取内容

你不需要更多这样的东西

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

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