2009-11-26 3 views
4

ByteBuffer가 뒤집어 져야하는지 확실하게 감지 할 수있는 방법이 있습니까?ByteBuffer, 뒤집기가 필요한지를 감지하는 명확한 방법은 무엇입니까

데이터 구조체의 패킹 및 패킹에 사용되며 바이트의 저장/압축 풀기에 사용되는 ByteBuffer가 있습니다.

그러나 쓰기 작업이 완료되었거나 읽기 작업이 수행되었거나 ByteBuffer가 내 코드로 전달 된 경우 버퍼가 쓰기 모드 또는 읽기 모드에서 수동으로 위치 및 제한을 조작하지 않는다고 보장 할 수 없습니다 .

부분 읽기 및 쓰기도 현재이 문제에 추가됩니다. 필자는 버퍼가 쓰기 모드로 남고 복제본이 만들어지고 읽기 목적으로 플립 된 규칙을 채택했습니다. 버퍼가 내 코드로 전달되면 수동으로 검사되고 위치 및 제한은 쓰기 모드와 동일하게 설정됩니다. 확실히 더 좋은 방법이 있습니다. 객체에

답변

6

캡슐화를 - 다음과 같은 :

class FlippingByteBuffer { 
    ByteBuffer buffer; 
    boolean isInUse; 
    boolean/Enum mode; //Is it read or write? 
} 

그런 다음 코드에서 사용할 수 있습니다 :

//I'm about to read 
FlippingByteBuffer fbb =...; 
fbb.beginReading(); 
doSomething(fbb.getByteBuffer()); 
fbb.finishReading(); 

일이 일어나고있는 때 당신이 알고있는이 방법. 읽기와 쓰기가 서로 차단되도록하기 위해 Lock 초를 사용할 수도 있습니다.

중간에 뭔가있는 것이 있으면 (뭔가를 부르며 다시 전화하는 것입니다.) FlippingByteBuffer을 넣을 수 있습니다. 지도를 만들고 /하거나 ThreadLocal (ewww!)에 넣거나 FlippingByteBufferByteBuffer으로 구현하십시오. 그 당신이하고있는 일에 따라 모드간에 자동으로 전환 할 수 있습니다 (읽기 및 쓰기 방법 사용).

+3

어떻게 Java가 API에서이 캡슐화를 제공하지 못하는지 중요한 기능인 것 같습니다. if 블록 내에서 flip()을 사용하면 읽기 또는 쓰기 모드인지 여부를 알 수 없습니다. . – mins

2

아이디어로, ByteBuffer를 다른 클래스로 래핑하는 것은 어떻습니까? 이 클래스는 읽기 또는 쓰기 작업을 수행 할 때마다 원하는 상태를 업데이트하고 유지 관리 할 수 ​​있습니다. 당신은 또한 thread-safe하게 만들기 위해 locking이나 다른 메카니즘을 구현하기를 원할지도 모른다.

0

"읽기"와 "쓰기"모드의 개념이 ByteBuffer 개념의 일부이기 때문에 ByteBuffer의 일부가 아닌 이유라고 생각합니다. 버퍼는 언제든지 읽기 또는 쓰기가 가능하므로 읽기/쓰기 상태에 엄격하게 존재하지는 않습니다.

일단이 사실을 깨닫게되면 우리 자신의 읽기/쓰기 상태 추적을 구현해야합니다.

이것은 일반적으로 ByteBuffer 인터페이스가 확장 가능하지 않기 때문에 nio가 구현해야하는 일반적인 사용 사례입니다.

관련 문제