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


96

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

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

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


5
읽기에서 쓰기로 (또는 그 반대로) 버퍼를 "플립"합니다. Thushw.blogspot.com/2009/10/…
Brian Roach

2
@BrianRoach : 읽기에서 쓰기로 전환되지만 고정 크기 구조를 작성하지 않는 한 읽기 쓰기에 유용하지 않습니다. 읽기 위해 쓰기를 뒤집으려면 reset대신 사용하십시오.
nneonneo 2013

"객관적인"질문을하는 것을 잊지 마십시오. 또는 적어도 주된 질문을 객관적으로 보이게 만드십시오. : D

@nneonneo-질문이 아니었고 세부 사항을 설명하는 데 많은 시간을 할애하지 않았으므로 댓글과 링크 만 있으면됩니다.
Brian Roach 2013

답변:


131

에 대한 매우 일반적인 사용 사례 중 하나 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);
}

의 유형은 out무엇입니까?
Suzan Cioc 2013

6
또는 write(ByteBuffer)방법 이있는 다른 것 . (... 그 형태가 무엇인지 정말 관련이 없습니다)
스티븐 C

1
그것은해야 Buffer.clear용량 및 위치로 리셋 제한을 0으로 Buffer.reset재설정 만 위치 mark.
Kelvin Ng 2013 년

1
@KelvinNg : 당신 말이 맞아요. 이를 반영하기 위해 답변을 수정했습니다. 좋은 캐치 감사합니다!
nneonneo

1
@ user963241 : I / O 에서 버퍼로 읽기 , 버퍼 에서 I / O로 쓰기 .
nneonneo

7

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 을 참조 하십시오 .


매우 광범위한 범위에 대한 링크에 감사드립니다! 소스가 포함되면 너무 좋습니다. 자바 API 문서는 마치 일반적인 컴퓨터 과학 용어 인 것처럼 설명없이 'flip'이라는 단어를 사용하는 것처럼 보였지만 분명히 몇 사람 (나를 포함하여)이 그 사실을 발견하지 못했습니다.
John Meyer

2

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

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

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

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


6
그래서 불만은 무엇입니까? 개인적인 불만이있는 경우도 괜찮지 만 "X API가 안좋아, 사람들이 그렇게 말 했어요"라고만 말하는 것은 아닙니다.
nneonneo 2013

13
그 링크를 게시하는 것은 말 그대로 처음에해야 할 모든 것입니다. 나는 당신이 거짓말을한다고 비난 한 적이 없으며, 불만의 원인과 성격에 대해 자세히 설명해달라고 요청했을뿐입니다.
nneonneo 2013

2
이것은 사람들이 선택한 적절한 노력으로 자발적으로 도움을 제공하는 곳입니다. 각 답변을 잘 연구 된 학술 논문으로 확장 할 필요는 없습니다.
irreputable

8
그리고 이것은 또한 사람들이 신뢰할 수있는 것처럼 들리지 않는 한 누군가의 말을 받아들이지 않을 곳입니다.
arunmoezhi

8
출처를 제공 할 필요조차 없습니다. ByteBuffer가 잘못 설계되었다는 것은 명백합니다. 플립은 목적을 채우는 것이 아니라 뒤집는 것을 잊었을 때 버그의 원인이 될뿐입니다. 그들이 그것을 집어 넣고 자하는 통제 할 수없는 충동을 느낀다면, 적어도 뒤집힌 ByteBuffers를 다른 클래스로 만들어서 타입 시스템이 버그를 잡을 수 있도록하십시오.
Gurgeh 2011

0

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.