2016-02-05 19 views
5

Tôi mới dùng Java NIO và không chắc chắn làm thế nào để làm những điều nio-ishly.Làm thế nào để tôi nhận được từ một ByteBuffer chỉ với 1 byte còn lại (Java NIO)

Giả sử tôi đã đọc một số dữ liệu từ ổ cắm vào một ByteBuffer và sử dụng tất cả các byte nhưng một, sử dụng các phương thức nhận được ByteBuffer. Tôi biết điều tiếp theo sẽ là bốn byte với một số nguyên ở định dạng nhị phân, vì vậy tôi muốn sử dụng getInt(), nhưng chỉ byte đầu tiên của int là trong bộ đệm.

Điều tự nhiên đối với tôi là lấp đầy bộ đệm bằng một số byte khác từ kết nối rồi tiếp tục. Nếu tôi hiểu chính xác, tôi có thể đạt được điều này với

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

và sau đó đọc thêm byte.

Vì không có phương pháp nào có hành vi đó, nhưng có phương pháp flip(), tôi tự hỏi liệu suy nghĩ của tôi có sai hay không. Có cách nào tốt hơn để làm điều này?

Tình huống này sẽ xảy ra tự nhiên, ví dụ: nếu kết nối cung cấp luồng dài + tin nhắn dữ liệu.

+0

Nope nope nope. Đọc câu hỏi cẩn thận ... đây là dữ liệu đến từ một ổ cắm, được đệm, và nó như vậy sẽ xảy ra rằng byte đầu tiên của số nguyên đã "tách". Các byte khác đang đến, mặc dù, do đó, nó sẽ là sai để đọc một byte và đúc nó. Những gì OP muốn là để treo vào byte đó cho đến khi 3 byte khác được biết đến. – dcsohl

+0

@ dcsohl bạn đúng sai lầm của tôi – Pooya

+1

Sau một 'nhỏ gọn()', bộ đệm được thiết lập để có thể đọc thêm byte. Sau khi đọc thêm một số byte, 'flip()' và đọc thêm. –

Trả lời

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

Vui lòng không thay đổi vị trí. Vị trí sau khi compact() trỏ đến byte đầu tiên sau phần chưa được lọc của bộ đệm - chính xác nơi bạn muốn.

Giới hạn thiết lập cho dung lượng dự phòng: compact() đã làm điều đó cho bạn.

Các vấn đề liên quan