黑马程序员技术交流社区
标题:
内存映射文件
[打印本页]
作者:
孙朋帅
时间:
2011-7-20 00:48
标题:
内存映射文件
听别人说:如果我们要创建和修改太大而不能放入内存中的文件,可以用内存映射文件来实现。
具体是怎么回事,一直都不是太清楚。不知哪位仁兄研究过?大家相互讨论一下。
作者:
匿名
时间:
2011-7-20 10:11
标题:
回复自己的帖子
没有人回复,
今早自己也查找了半天资料,在这里给大家分享一下。
内存映射文件让我们可以假定整个文件都存放在内存中,而且可以完全把它当做非常大的数组来访问,
例如:[code=java]import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class LargeMappedFiles {
/**
* @param args
*/
static int length = 0X8ffffff;// 128M
public static void main(String[] args) throws FileNotFoundException, IOException {
// TODO Auto-generated method stub
MappedByteBuffer out = new RandomAccessFile("test.dat", "rw")
.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length);
for(int i=0;i<length;i++){
out.put((byte)'x');
}
System.out.println("Finished writing");
for(int i=length/2;i<length/2+6;i++){
System.out.println((char)out.get(i));
}
}
}[/code]我们首先由RandomAccessFile,获得该文件山的通道,然后调用map()产生一种特殊类型的直接缓冲器MappedByteBuffer。在这里我们必须指定映射文件的初始位置和映射区得长度,这样我们就可以映射某个大文件的较小部分。
上面的程序创建文件为128M,这可能比操作系统一次性所允许早如的内存的空间要大。但是似乎我们能访问到整个文件,虽然只有一部分文件载入了内存,但是文件的其余部分可以被交换出去。就是用这种方式,我们很容易的修改大的文件。底层操作系统的文件映射工具也是为了最大化的提高性能。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2