这是一个新的系列,将会记录在工作之外写的一些小的程序,而且是有一定难度并且实用的小代码,相信会给自己和给读者一些收获。
这个系列的原因是有的时候回想自己的工作历程经常想不起曾经实现过哪些有意思的东西,总结提炼过哪些模型,这个系列将会记录这一切。
在前段时间的工作中曾经有个需求是要对一个内存中的Queue做持久化。组内的大牛使用了文件完成了一个FileBasedQueue,很有意思,把代码简化和重写了后下放出来:
实现要点:
1.使用了NIO、FileChannel、MappedByteBuffer来加快读写文件的速度
2.一次创建一个128M的文件Page,如果不够用再开辟下一个文件Page
3.单独使用一个Index文件记录当前读和写分别是在哪个文件Page中
4.使用一个Type位标记文件中对象的状态:EMPTY、FULL、ROTATE
5.用sun的cleaner来完成MappedByteBuffer的unmap
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import com.sun.corba.se.impl.ior.WireObjectKeyTemplate;
import sun.nio.ch.DirectBuffer;
import static java.nio.channels.FileChannel.MapMode.READ_WRITE;
public class FileQueue<T extends Serializable> {
public static final int PAGE_S