Memory-mapped files allow you to create and modify files that are too big to bring into memory.
With a memory-mapped file, you can pretend that the entire file is in memory and that you can access it by simply treating it as a very large array.
/**
* Creating a very large file using mapping
* @author WPeng
*
* @since 2012-11-7
*/
public class LargeMappedFiles {
static int length = 0x8ffffff; //128M
public static void main(String[] args) throws FileNotFoundException, IOException {
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));
}
}
}
To do both writing and reading, we start with a RandomAccessFile, get a channel for that file.
And then call map() to produce a MppedByteBuffer, which is a particular kind of direct buffer.
Note that you must specify the starting point and the length of the region that you want to map in the file;
this means that you have the option to map samller regions of a large file.
The file createed with the preceding program is 128M long.
which is probably larger than your OS will allow in memory at one time.
the file appears to be accessible all at once because only portions of it are brought into memory.
and other parts are swapped out.
this way a very large file(up to 2 GB) can easily be modified.
note that the file-mapping facilities of the underlying operating system are used to maximize performance.