内存映射文件

     以前一直使用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()等这样的用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值