Что вы знаете о RandomAccessFile?
RandomAccessFile — это класс из пакета java.io, обеспечивающий чтение и запись данных в произвольном месте файла.
Аналогия из жизни: обычный поток — это кассетная лента, которую можно только перематывать вперёд.
RandomAccessFile— это CD-диск, где можно мгновенно перейти к любому треку.
В отличие от InputStream/OutputStream, RandomAccessFile не является частью этих иерархий. Это полностью самостоятельный класс со своими, преимущественно нативными, методами. Такое решение обусловлено уникальным поведением: возможность перемещения по файлу вперёд и назад принципиально отличается от последовательного потокового чтения/записи.
Специфические методы
| Метод | Назначение |
|---|---|
getFilePointer() |
Возвращает текущую позицию в файле |
seek(long pos) |
Перемещает указатель на указанную позицию |
length() |
Возвращает размер файла в байтах |
setLength(long newLength) |
Устанавливает размер файла (обрезает или расширяет) |
skipBytes(int n) |
Пропускает указанное количество байт |
getChannel() |
Возвращает связанный FileChannel для NIO-операций |
Класс также предоставляет методы для типизированного чтения (readInt(), readLong(), readUTF(), readLine()) и записи (writeInt(), writeLong(), writeUTF()), аналогичные DataInputStream/DataOutputStream.
Пример: чтение записи по смещению
Пример
try (RandomAccessFile raf = new RandomAccessFile("records.dat", "r")) {
int recordSize = 100; // каждая запись 100 байт
int recordNumber = 42;
raf.seek((long) recordNumber * recordSize);
int id = raf.readInt();
String name = raf.readUTF();
}
На практике RandomAccessFile используется для работы с файлами фиксированной структуры (индексные файлы, базы данных), при реализации файлового кэша и при необходимости изменять данные в середине файла без перезаписи всего файла.
На собеседовании: подчеркните, что
RandomAccessFileне входит в иерархию InputStream/OutputStream, поддерживает произвольный доступ черезseek()иgetFilePointer(), и требует указания режима доступа в конструкторе.