这是OutputStream的一个子类,其输出设备是内存,准确来说是RAMFile,即将数据写入到RAMFile的Vector中去。
该类有一个最重要的方法,现在把它整个贴出来
public void flushBuffer(byte[] src, int len) {
int bufferNumber = pointer/BUFFER_SIZE; //buffer序列,即当前所写Buffer在RAMFile中的Vector中的序列号
int bufferOffset = pointer%BUFFER_SIZE; //偏移量,即当前所写字节在当前Buffer中的偏移量。
int bytesInBuffer = BUFFER_SIZE - bufferOffset; //当前Buffer的剩余可写字节数
//bytesToCopy是实际写入的字节数,如果当前Bufer的剩余字节数大于需要写的字节的总数则写入所有字节
//否则,将当前Buffer写满即可,剩余的字节将写入下一个Buffer
int bytesToCopy = bytesInBuffer >= len ? len : bytesInBuffer;
if (bufferNumber == file.buffers.size())
file.buffers.addElement(new byte[BUFFER_SIZE]); //在RAMFile中添加新的byte[1024]元素
byte[] buffer = (byte[])file.buffers.elementAt(bufferNumber);
System.arraycopy(src, 0, buffer, bufferOffset, bytesToCopy);
if (bytesToCopy < len) { // not all in one buffer,
int srcOffset = bytesToCopy;
bytesToCopy = len - bytesToCopy; // remaining bytes 剩余的未写入的字节数
bufferNumber++; //将buffer数增加1
if (bufferNumber == file.buffers.size())
file.buffers.addElement(new byte[BUFFER_SIZE]);
buffer = (byte[])file.buffers.elementAt(bufferNumber); //剩余字节写入下一个Buffer
System.arraycopy(src, srcOffset, buffer, 0, bytesToCopy);
}
pointer += len;
if (pointer > file.length)
file.length = pointer; //移位文件指针 在原有的基础上加上实际写入的字节总数
file.lastModified = System.currentTimeMillis(); //修改文件的最后修改时间为当前时间
}
从指定的字节数组复制指定长度的字节到RAMFile中去。由于RAMFile中Vector的元素是byte[1024]所以可能存在做一次该操作
要操作两个Vector元素的情况。即先将当前byte[1024]数组填满,再新建一个元素装载剩余的字节。
另外还有一个writeTo(OutputStream out)方法,将RAMFile中的数据输出到另一个输出流