2012-05-08 1 views
0

FileChannel.read(ByteBuffer[],int,int)-java-NIO의 방법을 사용하여 파일의 특정 부분을 읽는 방법을 아는 사람이 있습니까?Java-NIO : 오프셋 주소/NullPointer와 함께 FileChannel.read() 사용

ByteBuffer[] bb = new ByteBuffer[(int) fChannel.size()]; 
fChannel.read(bb, offsetAddress, endAddress); 

read() - 메서드를 실행하는 동안 NullPointer를 throw합니다. 버퍼가 충분히 커야합니다. offsetAddress는 0이고 endAddress는 255이며, 파일 크기는 그 이상입니다.

+0

그래서 파일의 모든 바이트마다 ByteBuffer를 만들고 있습니까? 그것의 요점은 무엇입니까? 파일 크기는 얼마입니까? –

답변

0

배열을 만들었지 만 그 안에 아무 것도 넣지는 않습니다.

아마도 같은 것을 : 책을 읽어 할 버퍼가 없기 때문에 당신은 방법에 빈 배열을 전달하는

ByteBuffer[] bb = new ByteBuffer[(int) fChannel.size()]; 
bb[0] = ByteBuffer.allowcate(1024); 
bb[1] = ByteBuffer.allowcate(1024); 
... 
+0

네, 물론 잊어 버렸습니다. 배열을 하드 코딩 된 bb로 채우는 것은 나에게 널 포인터를 준다. 얼마나 많은 바이트 버퍼를 배열에 할당해야합니까? 나는 단순히 그것이 작동하는 방식을 얻지 못하며, 따라서 그것을 올바로 사용하는 방법을 모르겠다. –

+1

@ user1004816 그럼 왜 그것을 전혀 사용하지 않습니까? 왜 그냥 쓰기 (ByteBuffer)를 사용하고 당신의 인생을 간단하게 유지하지? * 여러 ByteBuffers를 작성하지 않아도 필요없는 API를 충족시키기 위해 작성하는 것은 무의미합니다. – EJP

0

, 그래서 독서는 NPE가 발생합니다.

그러나 FileChannel.read (ByteBuffer [], int, int) 메서드는 파일 채널의 데이터를 연속적으로 시리즈로 읽는 "분산 읽기"를 수행해야합니다. 의 버퍼 다른 버퍼에 파일의 헤더와 본문을 읽기 :

ByteBuffer header = ByteBuffer.allocate(headerLength); 
ButeBuffer body = ByteBuffer.allocate(bodyLength); 
FileChannel ch = FileChannel.open(somePath); 
ch.read(new ByteBuffer[]{ header, body }, dataOffset, headerLength + bodyLength); 

다음 bodyLength 바이트로 첫 headerLength의 바이트 헤더와 바디를 채 웁니다.

파일에서 버퍼로 바이트를 읽으려면 (OP가 원하는 것 같다) FileChannel.read (ByteBuffer, long) 메서드를 사용해야합니다.이 메서드는 거기에 필요한만큼의 바이트를 읽습니다 주어진 버퍼의 남은 바이트 수 :

ByteBuffer bb = ByteBuffer.allocate(bytesToRead); 
FileChannel ch = FileChannel.open(somePath); 
ch.read(bb, dataOffset);