2013-02-09 35 views
60

Tại sao phương thức flip() của ByteBuffer gọi là "lật"? "Lật" ở đây là gì? Theo apidoc, hai flips liên tiếp sẽ không khôi phục trạng thái ban đầu, và nhiều flips có thể sẽ có xu hướng limit() trở thành 0.Mục đích của phương pháp lật ByteBuffer là gì? (Và tại sao nó được gọi là "lật"?)

Tôi có thể "unflip" bằng cách nào đó để sử dụng lại byte đã vượt quá giới hạn không?

Tôi có thể nối đuôi được lật với một số dữ liệu khác không?

+1

Nó "lật" bộ đệm từ đọc để viết (và ngược lại). http://thushw.blogspot.com/2009/10/java-bytebuffer-how-does-this-work.html –

+1

@BrianRoach: Nó lật từ đọc để viết nhưng không phải là hữu ích để viết để đọc trừ khi bạn đang viết cấu trúc kích thước cố định. Để lật để ghi để đọc, hãy sử dụng 'đặt lại' để thay thế. – nneonneo

+0

Hãy nhớ đặt câu hỏi "khách quan"; hoặc, ít nhất, làm cho câu hỏi chủ yếu dường như khách quan: D –

Trả lời

83

Một trường hợp sử dụng khá phổ biến cho ByteBuffer là xây dựng một số cấu trúc dữ liệu từng mảnh và sau đó viết toàn bộ cấu trúc đó vào đĩa. flip được sử dụng để lật ByteBuffer từ "đọc từ I/O" (put ting) thành "viết cho I/O" (get ting): sau một chuỗi put s được sử dụng để điền vào ByteBuffer, flip sẽ đặt giới hạn của bộ đệm đến vị trí hiện tại và đặt lại vị trí về 0. Điều này có tác dụng thực hiện tương lai get hoặc write từ bộ đệm ghi tất cả những gì là put vào bộ đệm và không còn nữa.

Sau khi hoàn thành put, bạn có thể muốn sử dụng lại ByteBuffer để tạo cấu trúc dữ liệu khác. Để "unflip" nó, hãy gọi clear. Đây resets các giới hạn công suất (làm cho tất cả các bộ đệm có thể sử dụng), và vị trí để 0.

Vì vậy, một kịch bản sử dụng điển hình:

ByteBuffer b = new ByteBuffer(1024); 
for(int i=0; i<N; i++) { 
    b.clear(); 
    b.put(header[i]); 
    b.put(data[i]); 
    b.flip(); 
    out.write(b); 
} 
+0

Loại 'out' là gì? –

+0

Một 'WritableByteChannel', chẳng hạn như' FileChannel' hoặc 'SocketChannel'. – nneonneo

+5

Hoặc bất kỳ thứ gì khác có phương thức 'write (ByteBuffer)'. (Nó không thực sự có liên quan gì kiểu của nó là ...) –

1

ByteBuffer được thiết kế ốm. Có rất nhiều khiếu nại từ các lập trình viên phong nha.

Vì vậy, đừng cố gắng giải thích về điều đó, chỉ cần nghiên cứu và sử dụng API cẩn thận.

Bây giờ tôi không thể chê bai nó mà không cần trình bày một sự thay thế, vì vậy ở đây là:

Một đệm đã cố định capacity; nó duy trì 2 con trỏ: startend. get() trả về byte tại vị trí start và gia số start. put() đặt byte tại vị trí end và gia số end. Số flip()!

+0

[[cần dẫn nguồn]] (Tôi chưa từng nghe những phàn nàn này về 'ByteBuffer'). Ngoài ra, các tài liệu nói rằng chỉ có một "vị trí hiện tại", không phải là "bắt đầu" và "kết thúc". – nneonneo

+0

Tôi đã nghe, bạn có thể dùng từ ngữ của tôi cho nó. – irreputable

+3

Vì vậy, khiếu nại là gì? Nếu bạn có một số khiếu nại cá nhân đó là OK quá, nhưng nó không làm gì để chỉ nói "X API hút, mọi người nói như vậy". – nneonneo

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