如何将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中读取数据。