2012-05-08 53 views
0

有誰知道如何使用java-NIO的方法FileChannel.read(ByteBuffer[],int,int)來只讀取文件的某個部分?Java-NIO:使用FileChannel.read()和offset-address/NullPointer

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

嘗試執行read()方法時拋出一個NullPointer。緩衝區應該足夠大,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那麼爲什麼要使用它呢?爲什麼不使用write(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); 

將填充與第一headerLength字節報頭和身體用以下bodyLength字節。

如果你只是想從一個文件中讀取字節到一個緩衝區(這似乎是OP想要的),你應該使用FileChannel.read(ByteBuffer,long)方法,它將讀取儘可能多的字節是給定緩衝區中的剩餘字節:

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