Java 如何重用ByteBuffer将几个512字节的块写入套接字?

Java 如何重用ByteBuffer将几个512字节的块写入套接字?,java,nio,bytebuffer,Java,Nio,Bytebuffer,我的意思是: put 512 bytes SocketChannel#write(this data) start at the beginning and put 512 bytes again rinse & repeat 我仍在尝试掌握ByteBuffers,我也尝试过使用ByteBuffer#reset(),但我总是得到一个InvalidMarkException,即使这似乎是正确的解决方案(除非我错了,我不会感到惊讶!) 谢谢 编辑:具体地说,我正试图实现同样的效果,只是我想

我的意思是:

put 512 bytes
SocketChannel#write(this data)
start at the beginning and put 512 bytes again
rinse & repeat
我仍在尝试掌握ByteBuffers,我也尝试过使用
ByteBuffer#reset()
,但我总是得到一个InvalidMarkException,即使这似乎是正确的解决方案(除非我错了,我不会感到惊讶!)

谢谢

编辑:具体地说,我正试图实现同样的效果,只是我想以512字节的块而不是批量发送

不,
reset()
不是正确的方法。它用于“回滚”流或缓冲区,但并不是所有的流或缓冲区都支持它(在大多数情况下它不是很有用)。从javadoc:

将此缓冲区的位置重置为先前标记的位置


您可以使用
clear()
方法完全清除缓冲区(即将位置设置为零并开始在其中写入更多数据)。

其中说明并非所有字节缓冲区都支持reset()?你对InputStream.reset()感到困惑吗?@EJP我确实在想InputStreams。他得到了一个无效标记的例外,因为他没有设置标记。奇怪的是。我已经在.flip()中尝试过:
。。。频道。写入。。。in.clear()
已经很好了,但运气不好。@connergdavis发布了一些您的实际代码,看看发生了什么。你使用的是阻塞模式还是非阻塞模式?@Kayaman承认,过去一个小时我花了大部分时间试图将其作为一个缓冲区发送。这工作得很好,但唯一的问题是,如果我让它作为一个大部件发送数据,它似乎会逐渐消耗我的CPU,直至100%。。。当然,这是不好的。我处于阻塞模式,这是一个简单的每客户端线程模型。这是我遇到这个问题的地方。请注意,在其他地方,缓冲区被返回、翻转,数据正常发送到通道。