該類(lèi)是從RAMFile中讀數(shù)據(jù)用的
最重要的一個(gè)方法:
該方法存在著從RAMFile的多個(gè)byte[1024]中讀取數(shù)據(jù)的情況,所以應(yīng)該在循環(huán)中進(jìn)行處理
public void readInternal(byte[] dest, int destOffset, int len) {
int remainder = len;
int start = pointer;
while (remainder != 0) {
int bufferNumber = start/BUFFER_SIZE; // buffer的序號(hào)
int bufferOffset = start%BUFFER_SIZE; // buffer偏移量
int bytesInBuffer = BUFFER_SIZE - bufferOffset;// 在當(dāng)前buffer中剩下的字節(jié)數(shù)
//如果緩沖區(qū)中剩余的字節(jié)大于len,則讀出len長(zhǎng)度的字節(jié),如果不夠則讀出剩余的字節(jié)數(shù)
// bytesToCopy表示實(shí)際讀出的字節(jié)數(shù)
int bytesToCopy = bytesInBuffer >= remainder ? remainder : bytesInBuffer;
byte[] buffer = (byte[])file.buffers.elementAt(bufferNumber);
System.arraycopy(buffer, bufferOffset, dest, destOffset, bytesToCopy);
destOffset += bytesToCopy; //增加已經(jīng)復(fù)制的byte數(shù)據(jù)長(zhǎng)度 到 dest中的偏移量
start += bytesToCopy; //RAMFile文件指針,用來(lái)確定bufferNumber 和bytesInBuffer 相當(dāng)于內(nèi)存中的分頁(yè)
remainder -= bytesToCopy; //剩余的還未復(fù)制的字節(jié)數(shù)
}
pointer += len;//文件指針位置
}