2014-12-11 9 views
0

10MB의 이진 파일이 있습니다. 다른 크기의 청크로 읽어야합니다 (예 : 300, 273 바이트). 독서를 위해 나는 FileChannelByteBuffer을 사용한다. 지금은 각 반복 읽기마다 새로운 크기의 ByteBuffer을 할당합니다.ByteBuffer에 특정 바이트 수 읽기

ByteBuffer에 대해 한 번만 할당 (200KB라고 가정)하고 읽을 수 있습니까 (300, 273 바이트 등)? 나는 한번에 200KB 이상을 읽지 않을 것이다. 전체 파일을 읽어야합니다.

UPD

public void readFile (FileChannel fc, int amountOfBytesToRead) 
{ 
    ByteBuffer bb= ByteBuffer.allocate(amountOfBytesToRead); 
    fc.read(bb); 
    bb.flip(); 
    // do something with bytes 
    bb = null; 
} 

나는 인해 메모리 제약에 한 번에 전체 파일을 읽을 수 없습니다. 그게 제가 독서를하는 이유입니다. 효율성은 또한 매우 중요합니다 (즉, 다중 할당을 통해 현재 접근 방식을 사용하고 싶지 않은 이유입니다). 감사합니다

+0

시도 (코드)는 어디에 있습니까? –

+1

코드가 지금까지 어떻게 보입니까? – Emz

+0

300 바이트, 273 바이트, 그리고 나서 'FileChannel'에서 XYZ 바이트를 읽으 려하지만 ByteBuffer 만 할당하면됩니까? –

답변

2

당신이 필요로하는 크기의 여러 ByteBuffers을 선언하고 scatter-read : read(ByteBuffer[] dsts, ...)을 사용하십시오.

NIO를 잊어 버리고 DataInputStream,readFully()을 사용하십시오. 아래에 BufferedInputStream을 입력하면 성능이 저하되지 않습니다. 속도가 더 빠를 수도 있습니다.

+0

전체 파일을 한 번에 읽고 싶지 않습니다. 내 프로그램에서 저는 메모리와 효율성에 대해 매우 염려합니다. 너무 많은 공간을 할당하면 쓰레기 수거로 이어질 것입니다 (나는 그것을 피하고 싶습니다). 많은 배분은 비용면에서도 효율적 임 ( –

+0

) 질문에 이러한 추가 제약 조건을 모두 명시해야합니다. 그러나 반복적으로 할당하는 것에 관해서는 아무 말도하지 않았으며 읽기 당 총 200kB 만 언급합니다. – EJP

+0

@EJP 저는 DataInputStream.readFully를 몰랐으며 답안에서이를 감독했습니다. 그래서 나는 엄청난 대답을 지웠다. 적어도 뭔가 배웠습니다 :) – Joachim