What the Heck Is a File Hole?
A file hole occurs when the space on disk allocated for a file is less than the file size. Most modern filesystems provide for sparsely populated files, allocating space on disk only for the data actually written (more properly, allocating only those filesystem pages to which data was written). If data is written to the file in noncontiguous locations, this can result in areas of the file that logically contain no data (holes). For example, the following code might produce such kind of file:
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.io.File;
import java.io.RandomAccessFile;
import java.io.IOException;
public class FileHole{
public static void main (String [] argv) throws IOException {
// Create a temp file, open for writing, and get
// a FileChannel
File temp = File.createTempFile(“holy”,null);
RandomAccessFile file = new RandomAccessFile (temp, “rw”);
FileChannel channel = file.getChannel( );
ByteBuffer byteBuffer = ByteBuffer.allocateDirect (100);
putData (0, byteBuffer, channel);
putData (5000000, byteBuffer, channel);
putData (50000, byteBuffer, channel);
// there are two holes in this file. This file will
// not consume 5 MB on disk (unless the filesystem is
// extremely brain-damaged)
System.out.println (“Wrote temp file ‘” + temp.getPath( )
+ “‘, size=” + channel.size( ));
channel.close( );
file.close( );
}
private static void putData (int position, ByteBuffer buffer,
FileChannel channel) throws IOException {
String string = “*<– location ” + position;
buffer.clear( );
buffer.put (string.getBytes (“US-ASCII”));
buffer.flip( );
channel.position (position);
channel.write (buffer);
}
}