2016-02-05 168 views
5

我是Java NIO的新手,並且不確定如何做到這一點。如何從ByteBuffer獲取Int剩餘字節(Java NIO)

假設我已經從套接字讀取了一些數據到ByteBuffer,並使用ByteBuffer的get方法消耗了除1之外的所有字節。我知道接下來的事情將是四個字節的二進制格式的整數,所以我想使用getInt(),但只有int的第一個字節在緩衝區中。

對我來說很自然的是從連接中填充更多字節的緩衝區,然後繼續。如果我理解正確,我可以通過

buf.compact(); 
buf.position(buf.limit()); 
buf.limit(buf.capacity()); 

然後讀取更多字節。

由於沒有這種行爲的方法,但有flip()方法,我不知道我的想法是否是錯誤的。有沒有更好的方法來做到這一點?

這種情況自然會發生,例如,如果連接傳遞一個長度+數據消息流。

+0

不可以。仔細閱讀這個問題......這是從一個套接字進來的數據,被緩衝,並且碰巧整數的第一個字節被「分離」了。不過,其他字節即將出現,因此讀取一個字節並進行轉換將會是錯誤的。 OP想要的是掛在那個字節上,直到其他3個字節是已知的。 – dcsohl

+0

@dcsohl你對我的錯誤 – Pooya

+1

在壓縮()後,緩衝區被設置爲能夠讀取更多字節。讀取更多字節後,「flip()」並閱讀更多內容。 –

回答

2
buf.compact(); 
// wrong: buf.position(buf.limit()); 
// no need to: buf.limit(buf.capacity()); 

請不要改變位置。 compact()之後的位置指向緩衝區未獲取部分之後的第一個字節 - 正好在您想要的位置。

容量的設置限制是多餘的:compact()已經爲您做好了。