[英]Exception in thread "main" java.lang.NoSuchMethodError: java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer
[英]Java NIO ByteBuffer, write after flip
我是Java ByteBuffer的新手,想知道在翻轉后寫入ByteBuffer的正確方法是什么。
在我的用例中,我正在將outputBuffer寫入套接字:
outBuffer.flip();
//Non-blocking SocketChannel
int bytesWritten = getSocket().write(outBuffer);
此后,必須再次寫入輸出緩沖區。 同樣,並非outBuffer中的所有字節都可能已寫入套接字。
由於當前已被翻轉,如果它仍然在緩沖區中並且沒有被寫入套接字,如何在不覆蓋任何數據的情況下再次使其可寫?
如果我是對的,則outBuffer.position()== bytesWrited,限制應該是要寫入多少數據。
那么使用以下命令重用輸出緩沖區是否正確? :
int limit = outBuffer.limit()
outBuffer.limit(outBuffer.capacity());
outBuffer.position(limit);
同樣來自API規范: 以下循環通過緩沖區buf將字節從一個通道復制到另一個通道:
while (in.read(buf) >= 0 || buf.position != 0) {
buf.flip();
out.write(buf);
buf.compact(); // In case of partial write
}
由於目前已翻轉
它將保持翻轉。 寫不會改變這一點。
如果它仍然在緩沖區中並且未寫入套接字,如何使它再次可寫而不覆蓋任何數據?
您無需執行任何操作,但是如果您想在再次寫入之前閱讀,則應該進行翻轉/寫入/壓縮。 如果您只想重復寫入,只需在緩沖區仍處於當前狀態的情況下再次調用write()
。
但是我更喜歡始終准備好這些緩沖區以供讀取 ,因此不存在滑動的可能性,並在需要進行這些操作時自動進行翻轉/寫入/壓縮(或翻轉/獲取/壓縮),就像原子一樣。
請注意,你不應該使用clear()
除非你確信寫完成和緩沖區現在是空的。 在這種情況下,緊湊和透明是等效的。 但是始終緊湊會更簡單。
如果以阻止模式復制,請使用@zlakad引用的循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.