将输出流转换为字节数组输出流

我正在尝试将 a 转换为流。我无法找到任何关于如何做到这一点的明确简单的答案。这个问题在StackOverflow上的问题标题中被问到,但是问题的主体是如何将a更改为.我有一个已经创建的,答案中给出的这个例子将无法编译!OutputStreamByteArrayOutputByteArrayStreamOuputStreamOutputStream

这个问题就在这里

我有一个已经构造的输出流,长度为44字节,称为waveHeader。我想将其转换为ByteArrayOutputStream,因为我希望能够使用waveHeader.ToByteArray()将其更改为byte[],以便在以后的进程中简化;

有没有一种简单的铸造类型或允许这样做的东西?

如果没有,那么:

  • 如果无法转换原始输出流中的数据,有没有办法构造指向原始输出流中的数据的指针?

  • 有人如何访问输出流中包含的数据?

我是JAVA的新手。这对我来说只是一种爱好。Streams In VisualBasic .net 中更容易!


答案 1

有多种可能的情况:

a) 你有一个 ByteArrayOutputStream,但它被声明为 OutputStream。然后你可以做一个这样的演员:

void doSomething(OutputStream os)
{
    // fails with ClassCastException if it is not a BOS
    ByteArrayOutputStream bos = (ByteArrayOutputStream)os;
...

b)如果您有任何其他类型的输出流,则将其转换为BOS实际上没有意义。(通常需要强制转换它,因为要访问结果数组)。因此,在这种情况下,您只需设置一个新流并使用它即可。

void doSomething(OutputStream os)
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bos.write(something);
    bos.close();
    byte[] arr = bos.toByteArray();
    // what do you want to do?
    os.write(arr); // or: bos.writeTo(os);
...

c)如果你已经向任何类型的 OutputStream 写了一些东西(你不知道它是什么,例如,因为你从 servlet 中获取它),则没有办法取回该信息。你以后不能写你需要的东西。解决方案是答案 b) 在自己的流中写入数组,然后您可以将数组用于自己的目的,并将其写入实际的输出流。

请记住,ByteArrayOutputStreams将所有数据保存在内存中。


答案 2

您可以使用 .writeToByteArrayOutputStream

ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] bytes = new byte[8];
bos.write(bytes);
bos.writeTo(oos);

您可以创建 的实例。然后,您需要将数据写入此实例,然后使用接受 的方法,您可以启用 将输出写入作为参数传递给的实例。ByteArrayOutputStreamByteOutputStreamwriteToOutputStreamByteArrayOutputStreamOutputStream

希望它有效!


推荐