ByteBuffer의 flip () 메서드가 “flip”이라고하는 이유는 무엇입니까? 여기서 “플립”이란 무엇입니까? apidoc에 따르면 두 번의 연속 플립은 원래 상태를 복원하지 않으며 다중 플립은 아마도 limit()
0 이되는 경향 이 있습니다.
제한을 벗어난 바이트를 재사용하려면 어떻게 든 “언 플립”할 수 있습니까?
꼬리를 연결하여 다른 데이터와 뒤집을 수 있습니까?
답변
에 대한 매우 일반적인 사용 사례 중 하나 ByteBuffer
는 데이터 구조를 하나씩 구성한 다음 전체 구조를 디스크에 쓰는 것입니다. flip
플립 사용되는 ByteBuffer
“I / O로부터 판독 ‘(상기 put
에 팅)”I / 쓰기 O “( get
팅)의 시퀀스 후에 put
S가를 채우기 위해 사용되는 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 개의 포인터를 유지합니다 : start
및 end
. 위치 get()
의 바이트를 반환 start
하고 증분 start
합니다. 위치에 put()
바이트를 놓고 end
증분 end
합니다. 아니 flip()
!
답변
flip () 메서드는 채널 쓰기 또는 상대 가져 오기 작업의 새로운 시퀀스를 위해 버퍼를 준비합니다. 제한을 현재 위치로 설정 한 다음 위치를 0으로 설정합니다.
버퍼는 기록 된 데이터를 추적합니다. 포스트 쓰기, flip () 메서드가 호출되어 쓰기 모드에서 읽기 모드로 전환됩니다.