A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙朋帅 黑马帝   /  2011-7-20 00:48  /  2159 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

听别人说:如果我们要创建和修改太大而不能放入内存中的文件,可以用内存映射文件来实现。
具体是怎么回事,一直都不是太清楚。不知哪位仁兄研究过?大家相互讨论一下。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 没人回答就直接找答案。

查看全部评分

1 个回复

倒序浏览
黑马网友  发表于 2011-7-20 10:11:29
沙发

回复自己的帖子

没有人回复,
今早自己也查找了半天资料,在这里给大家分享一下。
内存映射文件让我们可以假定整个文件都存放在内存中,而且可以完全把它当做非常大的数组来访问,
例如:[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,这可能比操作系统一次性所允许早如的内存的空间要大。但是似乎我们能访问到整个文件,虽然只有一部分文件载入了内存,但是文件的其余部分可以被交换出去。就是用这种方式,我们很容易的修改大的文件。底层操作系统的文件映射工具也是为了最大化的提高性能。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马