该类是从RAMFile中读数据用的
最重要的一个方法:
该方法存在着从RAMFile的多个byte[1024]中读取数据的情况,所以应该在循环中进行处理
public void readInternal(byte[] dest, int destOffset, int len) {
int remainder = len;
int start = pointer;
while (remainder != 0) {
int bufferNumber = start/BUFFER_SIZE; // buffer的序号
int bufferOffset = start%BUFFER_SIZE; // buffer偏移量
int bytesInBuffer = BUFFER_SIZE - bufferOffset;// 在当前buffer中剩下的字节数
//如果缓冲区中剩余的字节大于len,则读出len长度的字节,如果不够则读出剩余的字节数
// bytesToCopy表示实际读出的字节数
int bytesToCopy = bytesInBuffer >= remainder ? remainder : bytesInBuffer;
byte[] buffer = (byte[])file.buffers.elementAt(bufferNumber);
System.arraycopy(buffer, bufferOffset, dest, destOffset, bytesToCopy);
destOffset += bytesToCopy; //增加已经复制的byte数据长度 到 dest中的偏移量
start += bytesToCopy; //RAMFile文件指针,用来确定bufferNumber 和bytesInBuffer 相当于内存中的分页
remainder -= bytesToCopy; //剩余的还未复制的字节数
}
pointer += len;//文件指针位置
}