2013-02-09 2 views
60

ByteBuffer의 flip() 메소드가 "flip"이라고하는 이유는 무엇입니까? 여기에서 "뒤집은"것은 무엇입니까? apidoc에 따르면 두 개의 연속 된 뒤집기는 원래 상태로 복원되지 않으며 복수의 뒤집기는 limit()이 0이 될 가능성이 높습니다.ByteBuffer의 flip 메서드의 용도는 무엇입니까? (그리고 왜 "플립"이라고 불리는가?)

한계를 벗어난 바이트를 다시 사용하도록 "펼치기"할 수 있습니까?

꼬리말을 연결하여 다른 데이터와 뒤집을 수 있습니까?

+1

버퍼를 읽기/쓰기로 "반전"합니다. 반대의 경우도 마찬가지입니다. http://thushw.blogspot.com/2009/10/java-bytebuffer-how-does-this-work.html –

+1

@BrianRoach : 글을 쓰거나 쓰지 않는 한 글을 쓸 때 유용하지는 않습니다. 고정 크기 구조. 읽고 쓰기 위해 플립하기 위해서는 대신'reset'을 사용하십시오. – nneonneo

+0

"객관적인"질문을하십시오. 또는 적어도, 주된 질문을 객관적으로 보일 수 있습니다 : D –

답변

83

ByteBuffer의 일반적인 사용 사례는 데이터 구조를 개별적으로 구성한 다음 전체 구조를 디스크에 씁니다. put S 시퀀스는 ByteBuffer을 채우기 위해 사용 된 후, flip는 제한을 설정한다 : flip는 (put는 팅) "I/O에 쓰기"행 (get 팅) "I/O로부터 판독"에서 ByteBuffer 플립 사용 버퍼의 현재 위치를 0으로 재설정합니다. 이것은 미래에 get 또는 write을 버퍼로 만드는 효과가 있으며, 그 결과는 put이었습니다.

put을 완료 한 후에 ByteBuffer을 다시 사용하여 다른 데이터 구조를 구성 할 수 있습니다. "unflip"하려면 clear으로 전화하십시오.

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

'출력'의 유형은 무엇입니까? –

+0

'FileChannel' 나'SocketChannel'과 같은'WritableByteChannel'입니다. – nneonneo

+5

또는'write (ByteBuffer)'메소드가있는 다른 것. (실제 타입과 관련이 없다.) –

1

의 ByteBuffer가 병 디자인 :이 용량 한계 (사용 가능한 버퍼의 모든 제작), 및 0 그래서

에 위치, 일반적인 사용 시나리오를 재설정합니다. 양질의 프로그래머들로부터 많은 불만들이 있습니다.

API에 대해 신중히 검토하고 사용하는 것이 좋습니다.

지금 그래서 여기이고, 대안 제시없이 험담 없습니다

를 버퍼가 capacity 고정있다; 2 개의 포인터를 유지합니다 : startend. get()start 위치의 바이트를 리턴하고 start을 증가시킵니다. put()은 바이트를 end 위치에 놓고 end을 증가시킵니다. 아니요 flip()!

+0

[[표창장 필요]] ('ByteBuffer'에 대한이 불만을 듣지 못했다.) 또한 문서에는 "시작"및 "끝"이 아닌 "현재 위치"만 있다고합니다. – nneonneo

+0

나는 그 말을 들었다. – irreputable

+3

그래서 불만은 무엇입니까? 개인적으로 불만을 제기해도 괜찮 았지만 "X API가 짜증나는 것"이라고 말하는 것은 아닙니다. – nneonneo