在Java中,我需要将OutputStream中的内容(我自己将数据填充到该流中)放入ByteBuffer中。如何以简单的方式做到这一点?如何将数据从OutputStream放入ByteBuffer?
回答
您可以创建ByteArrayOutputStream
并写入,并使用toByteArray()
将内容解压缩为byte[]
。然后ByteBuffer.wrap(byte [])
将创建一个ByteBuffer
与输出字节数组的内容。
尝试使用PipedOutputStream代替OutputStream。然后,您可以连接一个PipedInputStream以从PipedOutputStream中读取数据。
看起来很好。 ByteArrayOutputStream通过调用它的newInputStream方法可以做类似的想法。然而,还有更直接的解决方案 - 将ByteArrayOutputStream直接备份到ByteBuffer的数组。这就是我所做的。 – drasto 2010-04-26 21:12:03
@ DJClayworth的答案是一个更有效的变体。
作为@seh正确地注意到,ByteArrayOutputStream.toByteArray()
返回背衬byte[]
对象,它可能是低效的拷贝。但是,支持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());
其结果是,一旦所有的输出写入使用相同的缓冲作为输入流的基础。
好点,@mark。我在几个Java项目中都有这样的类,通常被限制为一个名为'PromiscuousByteArrayOutputStream'的包 - 私有类。这个名字故意漫长而不祥。 – seh 2013-03-28 19:27:20
getCount()不需要,因为ByteArrayOutputStream.size()返回count。 – 2014-12-24 02:30:37
尽管上面提到的答案可以解决您的问题,但它们都不像您期望的那样高效。 ByteArrayOutputStream或MyByteArrayOutputStream首先将数据写入Java堆内存,然后将其复制到ByteBuffer,这极大地影响了性能。
一个有效的实现是你自己写ByteBufferOutputStream类。其实这很容易做到。你必须提供一个write()方法。看到这个链接ByteBufferInputStream。
,因为我们可能需要为OutputStream重用现有的ByteBuffer(及其底层数组),而不是分配新数组来获得新的ByteBuffer,我相信这个答案更可接受。 – Ambling 2017-06-06 15:55:34
- 1. 如何将ByteBuffer的内容放入OutputStream中?
- 2. 如何将BufferedImage放入ByteBuffer?
- 3. 使用通道将数据从outputStream传递到bytebuffer
- 4. 如何将unsigned float放入ByteBuffer?
- 5. JVM如何将数据存储到ByteBuffer?
- 6. 如何从ByteBuffer读取数据
- 7. 将Java pcap解析器放入ByteBuffer
- 8. 如何从ByteBuffer
- 9. 从ByteBuffer获取IP数据包数据
- 10. 如何将数据放入数组中?
- 11. 如何将数据放入TKinter?
- 12. 如何将数据直接放入Blobstore?
- 13. 如何将3组数据放入asp.net
- 14. 如何将数据放入树视图?
- 15. 如何将数据放入图表中
- 16. 如何将JSON数据放入CoffeeScript中?
- 17. 如何将数据放入Java InputStream中?
- 18. 如何将数据放入主页面?
- 19. 如何将数据从数组中放入标签Swift 3
- 20. 如何将数据从缓冲区放入C中的数组?
- 21. 如何将数据从循环放入数组
- 22. 如何从表中将多行数据放入JSON数组
- 23. 如何从ByteBuffer获得short []
- 24. 如何在Java中将数组写入outputStream
- 25. 我如何从Firebase获取数据并将其放入this.props - React
- 26. 如何将数据从文件中放入QTable Widget项目?
- 27. 如何将数据从while循环放入表中?
- 28. 如何从okhttp和Asynctask将数据放入RecyclerView
- 29. 如何将数据从mssql放入列表框? PHP
- 30. 如何从TCP套接字获取数据到一个ByteBuffer
通常,您不能直接从输出流中读取数据。如果你自己填写数据,为什么你不能将它填充到ByteBuffer中呢? – 2010-04-26 20:28:17
如果您创建继承了OutputStream形式的类并使其可以直接从中读取,则可以间接读取它以及直接读取原因。我没有自己填充数据,有的框架(以及我不想触及的框架代码)。请参阅我的其他评论和答案。 – drasto 2010-04-30 21:19:13