2011-10-06 2 views
2

다음과 같이 ByteBuffer를 계속 읽는 상황이 있습니다.지정된 바이트 수만 읽는 ByteBuffer 및 FileChannel

ByteBuffer buffer = MappedByteBuffer.allocateDirect(Constants.BUFFER_SIZE); 

그러나 독서의 경계에 도달 할 때 난 단지 boundaryLimit - FileChannel's current position 읽을 필요 (나머지 바이트를 읽을 때 BUFFER_SIZE보다 작).

경계 제한이 x이고 현재 위치가 y 인 경우, y에서 x까지 바이트를 읽고 그 이상으로 읽지 않아야합니다.

어떻게해야합니까?

새 용량으로 다른 인스턴스를 만들고 싶지 않습니다.

+0

"* 읽기가 경계에 도달했을 때 *"란 무엇을 의미합니까? – aioobe

+0

읽기만 계속 진행해야하는 한계가 있습니다. 그 이후의 바이트는 읽혀서는 안됩니다. 한계가 경계입니다. 업데이트 된 질문 – nobody

답변

2

MappedByteBuffer를 사용하는 것은 오해의 소지가 있습니다. 파일의 임의의 위치에서 읽으려면 : 당신이 바이트의 전체 크기는 문제가되지 않습니다

channel.read(buffer); 
buffer.flip(); 
// Will be between 0 and Constants.BUFFER_SIZE 
int sizeInBuffer = buffer.remaining(); 

EDIT 이하를 읽는다면 당신은

ByteBuffer buffer = ByteBuffer.allocateDirect(Constants.BUFFER_SIZE); 

를 사용해야합니다.

RandomAccessFile raf = 
MappedByteBuffer buffer= raf.getChannel() 
     .map(FileChannel.MapMode.READ_WRITE, start, length); 
+0

그것의 매우 큰 파일과 나는 상 한계를 넘어서는 데이터가 필요 없다. 실제로 의도 된 시작 위치에서 지정된 끝 위치까지 데이터를 읽는 것이 목적입니다. – nobody

+0

파일의 임의 영역을 읽고 쓰고 싶다면 훨씬 더 간단한 해결책이 있습니다. READ_ONLY 또는 READ_WRITE로 설정할 수 있습니다. –

0

이러한 FileInputStream에, RandomAccessFile에, 또는 MappedByteBuffer 같은 다른 API를 사용하는 것보다이 다른 아무 대답이 없다. ByteBuffer를 사용해야 할 경우, 오버 리드가 발생하면이를 감지하여 그에 따라 보상해야합니다.

관련 문제