2013-06-02 23 views
9

Mam ByteBuffer, który może pomieścić maksymalnie (4 + size) bytes (tj. Liczbę całkowitą, po której następują znaki size). Jednak liczba znaków zapisanych w pliku ByteBuffer może być mniejsza niż size.Określ liczbę bajtów w ByteBuffer

Tak więc zastanawiałem się, czy jest tak, aby określić, ile znaków zostało zapisanych w pliku ByteBuffer, a nie tylko w ich całkowitym rozmiarze? limit, position i takie nie wydają się być tym, za czym jestem.

Dzięki za pomoc!

+0

Co powiesz na 'hasRemaining'? –

+0

'hasRemaining' zwraca wartość logiczną wskazującą, czy pozostało cokolwiek, a nie jak wiele bajtów pozostało. –

Odpowiedz

18

Po napisaniu do ByteBuffer, liczba zapisanych bajtów można znaleźć za pomocą metody position().

Jeśli następnie flip() bufor, liczbę bajtów w buforze można znaleźć metodami limit() lub remaining().

Po odczytaniu części bufora liczbę pozostałych bajtów można znaleźć za pomocą metody remaining().

+0

Dzięki Andy. Być może chodzi o to, że użyłem 'wrap' do skopiowania' byte [] 'do bufora? Czy to nieporządek przy korzystaniu z funkcji, o których wspomniałeś? Jeśli tak, czy istnieje sposób, w jaki mogę odczytać rzeczywistą liczbę bajtów zapisanych w bajtach []? Dzięki za pomoc. –

+0

@Girl Nie można znać faktycznej liczby zapisanych bajtów, ponieważ 'ByteBuffer' jest zasadniczo" możliwy do zobaczenia ". Jaki jest twój wzór zapisu? Czy stosujesz tylko bezwzględne metody odczytu/zapisu, względne metody odczytu/zapisu? – fge

+0

@fge Zasadniczo czytam z 'DatagrampPacket'. Wiem, że rozmiar MAX zawartości 'DatagramPacket' będzie wynosił' 4 + size'. Jednak możliwe jest, że liczba znaków po 'int' mogła być mniejsza niż' size'. Tak więc próbuję ustalić, ile znaków faktycznie było w 'DatagramPacket'. Dziękuję za Twoją pomoc. –

2
DatagramChannel channel = DatagramChannel.open(); 
ByteBuffer bb = ByteBuffer.allocate(5+size); 
channel.receive(bb); 
bb.flip(); 
// actual length of received packet 
int len = bb.remaining();