存储器映射文件允许我们创建和修改那些因为太大而不能放入内存的文件。有了存储器映射
文件,我们就可以假定整个文件都在内存中,而且可以完全把它当作非常大的数组来访问。
这种方法极大地简化了用于修改文件的代码。下面是一个小例子:
//: 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)也可以很容易地被修改。注意底层操作系统的文件映射工
具是被用来最大化地提高性能的。