Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将ByteBuffer的内容放入输出流?_Java_Outputstream_Bytebuffer - Fatal编程技术网

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设计架构才能获得性能优势。