18

我正在尝试将 an 转换OutputStreamByteArrayOutputStream。我无法找到有关如何执行此操作的任何明确简单的答案。这个问题是在 StackOverflow 上的问题标题中提出的,但问题的主体询问如何将 a 更改ByteArrayStreamOuputStream. 我OutputStream已经创建了一个,答案中给出的这个例子将无法编译!

这个问题在这里

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

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

如果没有,那么:

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

  • 有人将如何访问 OutputStream 中包含的数据?

我是 JAVA 的新手。这对我来说只是一个爱好。在 VisualBasic .net 中流更容易!

4

3 回答 3

27

有多种可能的情况:

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 将所有数据保存在内存中。

于 2014-11-16T19:25:27.767 回答
7

你可以使用的writeTo方法ByteArrayOutputStream

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

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

希望它有效!

于 2014-11-16T19:25:46.897 回答
-1

你可以toByteArray在你拥有的输出流上使用函数。也就是说你有 outputStream 缓冲区所以你可以做到buffer.toByteArray

有关更多信息,您可以查看Convert InputStream to byte array in Java的答案。

于 2014-11-16T19:28:32.733 回答