簡體   English   中英

Java 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM