【问题标题】:How do I re-use a ByteBuffer to write several 512-byte chunks to a socket?如何重新使用 ByteBuffer 将几个 512 字节的块写入套接字?
【发布时间】:2013-08-27 09:05:36
【问题描述】:

这就是我的意思:

put 512 bytes
SocketChannel#write(this data)
start at the beginning and put 512 bytes again
rinse & repeat

我仍在尝试掌握 ByteBuffers,并且我尝试过使用 ByteBuffer#reset(),但我总是收到 InvalidMarkException,即使这似乎是正确的解决方案(除非我错了,我不会感到惊讶! )

谢谢!

编辑:具体来说,我正在尝试实现同样的效果,除了我想以 512 字节的块而不是批量发送它。 http://privatepaste.com/1fb0e6df07

【问题讨论】:

    标签: java nio bytebuffer


    【解决方案1】:

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

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

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

    【讨论】:

    • 哪里说不是所有的ByteBuffers都支持reset()?您是否对 InputStream.reset() 感到困惑?
    • @EJP 确实我在考虑 InputStreams。他收到了 InvalidMarkException,因为他没有设置标记。
    • 这是奇怪的事情。我已经尝试过了:in.flip() ... channel.write(in) ... in.clear() 已经没有运气了。
    • @connergdavis 发布一些您的实际代码,看看发生了什么。您使用的是阻塞模式还是非阻塞模式?
    • @Kayaman 诚然,过去一小时的大部分时间里,我都在尝试将所有内容作为一个缓冲区发送。这工作得很好,但唯一的问题是,如果我让它将数据全部作为一个大块发送,它似乎会逐渐消耗我的 CPU 直到 100%……当然,这很糟糕。我处于阻塞模式,这是一个简单的每个客户端线程模型。这就是我遇到这个问题的地方。 privatepaste.com/1fb0e6df07注意别处,缓冲区返回,翻转,数据正常发送到通道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2011-10-05
    • 2015-11-29
    • 2013-11-14
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多