存储器映射文件
来源:互联网 发布:免费胸卡制作软件 编辑:程序博客网 时间:2024/06/06 10:59
存储器映射文件允许我们创建和修改那些因为太大而不能放入内存的文件。有了存储器映射
文件,我们就可以假定整个文件都在内存中,而且可以完全把它当作非常大的数组来访问。
这种方法极大地简化了用于修改文件的代码。下面是一个小例子:
//: c12:LargeMappedFiles.java
// Creating a very large file using mapping.
// {RunByHand}
// {Clean: test.dat}
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class LargeMappedFiles {
static int length = 0x8FFFFFF; // 128 Mb
public static void main(String[] args) throws Exception {
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.print((char)out.get(i));
}
} ///:~
为了既能写又能读,我们先由 RandomAccessFile 开始,获得该文件上的通道,然后调用
map()产生 MappedByteBuffer,这是一种特殊类型的直接缓冲器。注意我们必须指定
映射文件的初始位置和映射区域的长度。这意味着我们可以映射某个大文件的一个较小的部
分。
MappedByteBuffer 由 ByteBuffer 继承而来,因此它具有 ByteBuffer 的所有方法。这
里,我们仅仅展示了非常简单的 put()和 get(),但是我们同样可以使用像 asCharBuffer( )
等这样的用法。
前面那个程序创建的文件为 128M,这可能比操作系统允许的空间要大。看似我们可以一次
访问到整个文件,因为只有一部分文件放入了内存,文件的其他部分被交换了出去。用这种
方式,很大的文件(可达 2GB)也可以很容易地被修改。注意底层操作系统的文件映射工
文件,我们就可以假定整个文件都在内存中,而且可以完全把它当作非常大的数组来访问。
这种方法极大地简化了用于修改文件的代码。下面是一个小例子:
//: c12:LargeMappedFiles.java
// Creating a very large file using mapping.
// {RunByHand}
// {Clean: test.dat}
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class LargeMappedFiles {
static int length = 0x8FFFFFF; // 128 Mb
public static void main(String[] args) throws Exception {
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.print((char)out.get(i));
}
} ///:~
为了既能写又能读,我们先由 RandomAccessFile 开始,获得该文件上的通道,然后调用
map()产生 MappedByteBuffer,这是一种特殊类型的直接缓冲器。注意我们必须指定
映射文件的初始位置和映射区域的长度。这意味着我们可以映射某个大文件的一个较小的部
分。
MappedByteBuffer 由 ByteBuffer 继承而来,因此它具有 ByteBuffer 的所有方法。这
里,我们仅仅展示了非常简单的 put()和 get(),但是我们同样可以使用像 asCharBuffer( )
等这样的用法。
前面那个程序创建的文件为 128M,这可能比操作系统允许的空间要大。看似我们可以一次
访问到整个文件,因为只有一部分文件放入了内存,文件的其他部分被交换了出去。用这种
方式,很大的文件(可达 2GB)也可以很容易地被修改。注意底层操作系统的文件映射工
具是被用来最大化地提高性能的。
- 存储器映射文件
- 存储器映射
- 存储器映射
- 存储器映射
- 存储器映射
- S3C6410 存储器映射存储器映射
- S3C6410 存储器映射存储器映射
- 地址映射,存储器映射
- 虚拟存储器之存储器映射
- java1.4中的新I/O:存储器映射文件
- arm 映像文件存储器映射调整 android ld link script
- 存储器映射归纳
- [基础] 什么是存储器映射?
- 存储器映射(转载)
- ARM存储器映射
- s3c6410存储器映射
- s3c6410存储器映射
- 存储器映射归纳
- 简明VIM使用学习
- Android Push
- 消息内容定义XML
- Property attributes
- 这是我第一篇博文
- 存储器映射文件
- 树结构的遍历
- SQLite使用小例
- Extjs中Form页面隐藏存值修改
- 性能
- http://hi.baidu.com/xogjghsfhjemorr/item/5aab56f5f2f220ed1b111f5c
- linux 前台进程 后台进程
- Myeclipse6.0实现JPA 创建
- Object.prototype.toString.call 与数组判断