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

发布于 2024-09-04 09:34:23 字数 704 浏览 5 评论 0原文

我在这里遇到了一个很大的问题,我认为这是因为我不太明白应该如何使用Java提供的API。

我需要将 intbyte[] 写入 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() 方法。

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

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

冷血 2024-09-11 09:34:23

就像这样:

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

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

w.flush();

byte[] result = baos.toByteArray();

实际上你的第二个版本根本无法工作。 DataOutputStream 需要一个实际的目标流来写入数据。您无法执行new DataOutputStream()。实际上不存在这样的构造函数。

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.

风追烟花雨 2024-09-11 09:34:23

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

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

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();
栀子花开つ 2024-09-11 09:34:23

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

Use the former case - wrap DataOutputStream around the ByteArrayOutputStream. Just make sure you save the reference to the ByteArrayOutputStream. When you are finished, close() or at least flush() the DataOutputStream and then use the toByteArray method of the ByteArrayOutputStream.

巾帼英雄 2024-09-11 09:34:23

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

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

  • put(byte[] src)java.nio.ByteBuffer 的方法code> 为您的 byte[]
  • putInt(int value)
  • byte[] array() 获取内容

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
任性一次 2024-09-11 09:34:23

你不需要更多这样的

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

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();
黑寡妇 2024-09-11 09:34:23

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文