内存映射文件(memory-mapped file)能让你创建和修改那些大到无法读入内存的文件。有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问了。这种解决思路能大大简化修改文件的代码。下面就是一个简单的例子:
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入手。拿到channel之后,我们用map( )方法生成了一个MappedByteBuffer。这是一种特殊的"direct buffer"。注意,你必须指明,它是从文件的哪个位置开始映射的,映射的范围又有多大;
也就是说,它还可以映射一个大文件的某个小片断。
MappedByteBuffer是ByteBuffer的派生类,因此它具备了ByteBuffer的所有方法。这里只简单地演示了一下put( )和get( )方法,除此之外,你还可以使用asCharBuffer( )之类的方法。
上述例程创建了一个128MB的文件,或许这已经超出OS的允许范围了。文件的访问好像只是一瞬间的事,这是因为,真正调入内存的只是其中的一小部分,
其余部分则被放在交换文件上。这样你就可以很方便地修改超大型的文件了(最大可以到2 GB)。
注意,Java是调用操作系统的"文件映射机制(file-mapping facility)"来提升性能的。
由于Java的文件锁是直接映射操作系统的锁机制的,因此其它进程也能看到文件锁。
虽然你可以用wrap( ) 直接把char数组转换成CharBuffer,但实际上它还是一个ByteBuffer,而CharBuffer只是它的view。由此可知,
我们操控的对象永远都是ByteBuffer,因为只有它才能往channel里读写数据。
一般来说,你是不会让两个进程去共享一个网络socket的。)tryLock( ) 是
非阻塞的。它会试着去获取这个锁,但是如果得不到(其它进程已经以独占方式得到这个锁了),那它就直接返回。
而lock( )是阻塞的。如果得不到锁,它会在一直处于阻塞状态,除非它得到了锁,或者你打断了调用它(即lock( )方法)的线程,或者关闭了它要lock( )的channel,否则它是不会返回的。最后用FileLock.release( )释放锁。
还可以像这样锁住文件的某一部分
tryLock(long position, long size, boolean shared)
或者
lock(long position, long size, boolean shared)
这个方法能锁住文件的某个区域(size - position)。
其中第三个参数表示锁能不能共享。
虽然在修改文件的过程中,无参数的lock( )和tryLock( )方法的锁定范围会随文件大小的变化,带参数的方法却不行。如果你锁住了position到position+size这段范围,而文件的长度又增加了,那么position+size后面是不加锁的。而无参数的lock方法则会锁定整个文件,不管它变不变长。
锁是独占的还是共享的,这要由操作系统来决定。如果操作系统不支持共享锁,而程序又申请了一个,那么它会返回一个独占锁。你可以用FileLock.isShared( )来查询锁的类型(共享还是独占)。
http://dev.csdn.net/article/84/84727.shtm
分享到:
相关推荐
利用内存映射文件技术实现进程间通信,自pudn程序员联合开发网下载
通过使用“内存映射文件”,实现内存共享 代码包含如何定义共享的内存结构、如何创建共享内存映射文件、如何多程序调用共享内存映射文件、如何由非创建方程序来释放共享内存映射文件
我对内存映射文件的整理,摘自互联网呢,很有用的学习资料,你值得拥有
用内存映射文件实现的共享内存封装类。 实现了数据读写互斥。
文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类...目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的,本文下面将针对这种Windows核心编程技术展开讨论。
vc 内存映射文件.doc
8.4.2 使用内存映射文件读BMP文件的例子
内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将...
Visual C++ .NET环境下采用内存映射文件设计超大文件数据编辑器
本实例中定义了STL文件中的基本数据结构,采用普通文件读取和内存映射文件读取两种方式,并对二者效率进行对比
本文介绍利用内存映射文件修改大文件:在大文件内存前加入一段数据,若要使用内存映射文件,必须执行下列操作步骤: 1.创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件; 2.创建一个文件...
基于内存映射文件技术的海量影像数据快速读取方法
通过.net 4.0中的新类库使用内存映射文件
6.如何使用内存映射文件实现多个程序间互斥运行?(Visual C++编程 源代码)6.如何使用内存映射文件实现多个程序间互斥运行?(Visual C++编程 源代码)6.如何使用内存映射文件实现多个程序间互斥运行?(Visual C++...
文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类...目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的,本文下面将针对这种Windows核心编程技术展开讨论。
关于内存映射文件读写文件的方法,大家学习了解一下
随着信息技术和传感器技术的飞速发展,使得遥感图像的数据量呈几何级数的递增,而传统的利用文件指针来读取文件的方法,只能正确读取2GB以下的数据。针对此种情况,提出了新方法,并分析了其关键技术,用VC 给出了...
采用内存映射文件的方法处理大文件,快速有效的文件处理方式。
使用内存映射文件加快文件操作速度VB技术很实用的源码应网友要求,重新整理了此源码,没有的抓紧下载啊,