[java] ByteBuffer의 flip 메소드의 목적은 무엇입니까? (왜 “플립”이라고 부르나요?)

ByteBuffer의 flip () 메서드가 “flip”이라고하는 이유는 무엇입니까? 여기서 “플립”이란 무엇입니까? apidoc에 따르면 두 번의 연속 플립은 원래 상태를 복원하지 않으며 다중 플립은 아마도 limit()0 이되는 경향 이 있습니다.

제한을 벗어난 바이트를 재사용하려면 어떻게 든 “언 플립”할 수 있습니까?

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



답변

에 대한 매우 일반적인 사용 사례 중 하나 ByteBuffer는 데이터 구조를 하나씩 구성한 다음 전체 구조를 디스크에 쓰는 것입니다. flip플립 사용되는 ByteBuffer“I / O로부터 판독 ‘(상기 put에 팅)”I / 쓰기 O “( get팅)의 시퀀스 후에 putS가를 채우기 위해 사용되는 ByteBuffer, flip현재의 위치로 상기 버퍼의 제한을 설정한다 위치를 0으로 재설정합니다. 이것은 미래를 만들 get거나 write버퍼에서 버퍼에 있던 모든 것을 put더 이상 쓰지 않는 효과가 있습니다.

을 마친 후을 put다시 사용하여 ByteBuffer다른 데이터 구조를 구성 할 수 있습니다 . “언 플립”하려면을 호출하십시오 clear. 이렇게하면 용량 제한 (모든 버퍼 사용 가능)과 위치가 0으로 재설정됩니다.

따라서 일반적인 사용 시나리오 :

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);
}


답변

Flip은 현재 위치 값을 limit 속성에 할당하고 position 속성을 0으로 설정합니다. Flip은 버퍼에서 활성 요소 만 배출하는 데 유용합니다.

예를 들어, 아래 프로그램은 버퍼의 빈 요소가 아닌 “hello”를 출력합니다. 메서드 호출 제한 및 위치는 플립으로 대체 할 수 있습니다.

CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello");
// what below two line of code is what flip does
cbuff.limit(cbuff.position());
cbuff.position(0);
while(cbuff.hasRemaining()) {
    System.out.println(cbuff.get());
}

버퍼 및 채널에 대한 자세한 내용 은 http://www.zoftino.com/java-nio-tutorial 을 참조 하십시오 .


답변

ByteBuffer가 잘못 설계되었습니다. 괜찮은 프로그래머로부터 많은 불만이 있습니다.

따라서 그것에 대해 추론하지 말고 API를주의 깊게 연구하고 사용하십시오.

이제 대안을 제시하지 않고는 그것을 욕설 할 수 없으므로 여기에 있습니다.

버퍼는 고정되어 있습니다 capacity. 2 개의 포인터를 유지합니다 : startend. 위치 get()의 바이트를 반환 start하고 증분 start합니다. 위치에 put()바이트를 놓고 end증분 end합니다. 아니 flip()!


답변

flip () 메서드는 채널 쓰기 또는 상대 가져 오기 작업의 새로운 시퀀스를 위해 버퍼를 준비합니다. 제한을 현재 위치로 설정 한 다음 위치를 0으로 설정합니다.

버퍼는 기록 된 데이터를 추적합니다. 포스트 쓰기, flip () 메서드가 호출되어 쓰기 모드에서 읽기 모드로 전환됩니다.


답변