如何在Java中同时使用ByteArrayOutputStream和DataOutputStream?

如何在Java中同时使用ByteArrayOutputStream和DataOutputStream?,java,wrapper,bytearrayoutputstream,dataoutputstream,Java,Wrapper,Bytearrayoutputstream,Dataoutputstream,我在这里遇到了一个相当大的问题,我认为这是因为我不太理解如何使用Java提供的API 我需要将一个int和一个字节[]写入一个字节[] 我想使用DataOutputStream来解决writeInt(inti)和write(byte[]b)的数据写入问题,为了能够将其放入字节数组,我应该使用ByteArrayOutputStream方法toByteArray() 我知道这些类使用包装器模式,所以我有两个选择: DataOutputStream w = new DataOutputStream(n

我在这里遇到了一个相当大的问题,我认为这是因为我不太理解如何使用Java提供的API

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

我想使用
DataOutputStream
来解决
writeInt(inti)
write(byte[]b)
的数据写入问题,为了能够将其放入字节数组,我应该使用
ByteArrayOutputStream
方法
toByteArray()

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

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

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

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

如下所示:

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

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

w.flush();

byte[] result = baos.toByteArray();

实际上,你的第二个版本根本不起作用
DataOutputStream
需要一个实际的目标流来写入数据。您不能执行
新建DataOutputStream()
。实际上没有任何这样的构造函数。

使用前一个case-wrap
DataOutputStream
围绕
ByteArrayOutputStream
。只需确保通过tearrayoutputstream保存对
的引用即可。完成后,关闭()或至少刷新()数据输出流
,然后使用
ByteArrayOutputStream的toByteArray方法

Integer类有一个获取int的字节值的方法。

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

无论如何,如果您需要做的是简单的,并且不需要流方法,那么我将使用一个

  • put(byte[]src)
    为您的
    byte[]
  • putInt(int值)
  • 字节[]数组()
    来获取内容

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

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

你不需要更多像这样的东西

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

我一直在想,我真的有理由用tearrayoutputstream刷新包装的
吗?没有,但你永远不知道包装的行为。它实际上可以缓冲一些东西,所以我习惯性地刷新包装器:)。如果它是一个pass-thru包装器,它应该不会受到影响。您能声明byteArray变量吗?实际上w.写了什么(byteArray);是吗?啊,它现在可以工作了,我的十六进制编辑器有一些问题(我写它到文件中只是为了证明它和它的工作)欢迎使用stackoverflow!请考虑用代码编制格式>代码>代码>代码,这样阅读起来更容易。更多信息:
Example exampleExample = method(example); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.marshal(exampleExample , baos);
Message message = MessageBuilder.withBody(baos.toByteArray()).build();