内存映射文件

     以前一直使用FileInputStream来读取文件,使用FileOurputStream来写文件。今天恍然大悟,RandomAccessFile类可以在初始化的时候设定是用来“读”,还是“写”,还是“又读又写”。这样一来就很方便了,打破了以前只能通过FileInputStream来读取,FileOurputStream来写入的限制。

     例如:RandomAccessFile file=new RandomAccessFile(new File("out.txt"),"rw");

    下来说说今天的重点,就是内存映射文件。想象这样一种情况:有一个文件,特别的大假设有2G。我们想读取这个超级大文件中的一些数据,或者向这个文件中写入一些东西。那么使用RandomAccessFile来载入一个2G的文件的后果是可想而知的;而且内存还可能无法载入这么大的文件。所以,使用MappedByteBuffer来映射该文件的较小部分进行操作:

int length=0x8FFFFFF;    //128MB
MappedByteBuffer out=new RandomAccessFile("test.dat","rw").getChannel().map(Filehannel.MapMode.READ_WRITE,0,length);
//操作示范:
//写入:
for(int i=0;i<length;i++){
    out.put((byte)'x');
}
print("Finish writing.");
//读取:
for(int i=length/2;i<length/2+6;i++){
printnb((char)ou.get(i));
}

 

注意:获得文件上的通道后,调用map()产生MappedByteBuffer,这是一种特殊的直接缓冲器。我们必须指定映射文件的初始位置和映射区域的长度,这意味着我们可以映射某个大文件的较小的部分。

MappedByteBtffer由ByteBuffer继承而来,因此它具有ByteBuffer的所有方法,我们同样可以使用像asCharBuffer()等这样的用法。

你可能感兴趣的:(文件)