如何将OutputStream中的数据放入ByteBuffer?

在Java中,我需要将OutputStream中的内容(我自己将数据填充到该流中)放入ByteBuffer中。 如何以简单的方式做到这一点?

您可以创建一个ByteArrayOutputStream并写入它,并使用toByteArray()将内容作为byte[]提取。 然后ByteBuffer.wrap(byte [])将创建一个带有输出字节数组内容的ByteBuffer

@ DJClayworth的答案有一个更有效的变体。

正如@seh正确注意到的那样, ByteArrayOutputStream.toByteArray()返回了一个支持byte[]对象的副本 ,这可能效率很低。 但是,backing byte[]对象以及字节数都是ByteArrayOutputStream类的受保护成员。 因此,您可以创建自己的ByteArrayOutputStream变体直接公开它们:

 public class MyByteArrayOutputStream extends ByteArrayOutputStream { public MyByteArrayOutputStream() { } public MyByteArrayOutputStream(int size) { super(size); } public int getCount() { return count; } public byte[] getBuf() { return buf; } } 

使用这个类很简单:

 MyByteArrayOutputStream out = new MyByteArrayOutputStream(); fillTheOutputStream(out); return new ByteArrayInputStream(out.getBuf(), 0, out.getCount()); 

结果,一旦写入所有输出,就使用相同的缓冲区作为输入流的基础。

虽然上面提到的答案可以解决您的问题,但是没有一个能像您对NIO的期望那样高效。 ByteArrayOutputStream或MyByteArrayOutputStream首先将数据写入Java堆内存,然后将其复制到ByteBuffer,这会极大地影响性能。

一个有效的实现是自己编写ByteBufferOutputStream类。 实际上这很容易做到。 你必须提供一个write()方法。 请参阅此链接以获取ByteBufferInputStream 。

尝试使用PipedOutputStream而不是OutputStream。 然后,您可以连接PipedInputStream以从PipedOutputStream中读取数据。