Gymterview
middle

Что вы знаете о 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(), и требует указания режима доступа в конструкторе.