Java 如何将ByteBuffer的内容放入输出流?
我需要将Java 如何将ByteBuffer的内容放入输出流?,java,outputstream,bytebuffer,Java,Outputstream,Bytebuffer,我需要将java.nio.ByteBuffer的内容放入java.io.OutputStream中。(希望我有一个频道,但我没有)最好的方法是什么 我不能使用ByteBuffer的array()方法,因为它可以是只读缓冲区 我还可能在使用这个ByteBuffer和使用字节[]的常规数组之间插入对OutputStream的写入,我可以直接使用OutputStream.write()。查看。它将为您提供一个给定输出流的通道。使用WritableByteChannel适配器,您可以提供将其写入输出流的
java.nio.ByteBuffer
的内容放入java.io.OutputStream
中。(希望我有一个频道,但我没有)最好的方法是什么
我不能使用ByteBuffer的array()
方法,因为它可以是只读缓冲区
我还可能在使用这个ByteBuffer和使用字节[]
的常规数组之间插入对OutputStream的写入,我可以直接使用OutputStream.write()
。查看。它将为您提供一个给定输出流的通道。使用WritableByteChannel适配器,您可以提供将其写入输出流的ByteBuffer
public void writeBuffer(ByteBuffer buffer, OutputStream stream) {
WritableByteChannel channel = Channels.newChannel(stream);
channel.write(buffer);
}
这应该能奏效 如果我保留通道和流,我可以混合对这两个通道的调用吗?是的,当然可以,减少每次创建通道的成本:)注意,这种方法需要将ByteBuffer复制到一个临时数组中,然后写入OutputStream。如果性能很重要,您可能需要进行一些重构,以避免不必要的块复制。@trevor robinson,您能详细介绍一下该评论吗?为什么涉及副本?怎么能避免呢?@Frederik,OutputStream
本身只接受字节数组,而且由于可能不支持ByteBuffer.array()
,所以通常只有复制。作为特例,Oracle/OpenJDK通道。newChannel
impl会检查流是否(准确地)是一个FileOutputStream
,它有一个真正的本机通道;否则,它将返回一个适配器(Channels.WritableByteChannelImpl
),该适配器将以8KB的数据块从缓冲区复制到阵列。避免这种情况的唯一方法是在整个过程中使用通道。您必须为NIO设计架构才能获得性能优势。