Random access files permit nonsequential, or random, access to a file’s contents.
Consider the archive format known as ZIP. A ZIP archive contains files and is typically compressed to save space. It also contains a directory entry at the end that indicates where the various files contained within the ZIP archive begin, as shown in the following figure.
A ZIP archive.
- Open the ZIP archive.
- Search through the ZIP archive until you locate the file you want to extract.
- Extract the file.
- Close the ZIP archive.
Using this procedure, on average, you’d have to read half the ZIP archive before finding the file that you want to extract. You can extract the same file from the ZIP archive more efficiently by using the seek feature of a random access file and following these steps:
- Open the ZIP archive.
- Seek to the directory entry and locate the entry for the file you want to extract from the ZIP archive.
- Seek (backward) within the ZIP archive to the position of the file to extract.
- Extract the file.
- Close the ZIP archive.
This algorithm is more efficient because you read only the directory entry and the file that you want to extract.
The java.io.RandomAccessFile
class implements both the DataInput
and DataOutput
interfaces and therefore can be used for both reading and writing. RandomAccessFile
is similar to FileInputStream
and FileOutputStream
in that you specify a file on the native file system to open when you create it. When you create a RandomAccessFile
, you must indicate whether you will be just reading the file or also writing to it. (You have to be able to read a file in order to write it.) The following code creates a RandomAccessFile
to read the file named xanadu.txt
:
new RandomAccessFile("xanadu.txt", "r");
And this one opens the same file for both reading and writing:
new RandomAccessFile("xanadu.txt", "rw");
After the file has been opened, you can use the common read
or write
methods defined in the DataInput
and DataOutput
interfaces to perform I/O on the file.
RandomAccessFile
supports the notion of a file pointer. The file pointer indicates the current location in the file. When the file is first created, the file pointer is set to 0, indicating the beginning of the file. Calls to the read
and write
methods adjust the file pointer by the number of bytes read or written.
A ZIP file has the notion of a current file pointer.
RandomAccessFile
contains three methods for explicitly manipulating the file pointer.
int skipBytes(int)
— Moves the file pointer forward the specified number of bytesvoid seek(long)
— Positions the file pointer just before the specified bytelong getFilePointer()
— Returns the current byte location of the file pointer