Only my share

Java , Groovy and others

What the Heck Is a File Hole?

leave a comment »

 

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); 

          // Size will report the largest position written, but

         // 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);

      }
}

Written by adpjhype

January 27, 2009 at 5:52 am

Posted in Java

Tagged with , ,

Leave a Reply