Произвольный доступ к файлам
В ряде случаев, например, при создании системы
управления базой данных, требуется обеспечить
произвольный доступ к файлу. Рассмотренные нами
ранее потоки ввода и вывода пригодны лишь для
последовательного доступа, так как в
соответствующих классах нет средств
позиционирования внутри файла.
Между тем библиотека классов Java содержит класс
RandomAccessFile, который предназначен специально для
организации прямого доступа к файлам как для
чтения, так и для записи.
В классе RandomAccessFile определено два конструктора,
прототипы которых показаны ниже:
public RandomAccessFile(
String name, String mode);
public RandomAccessFile(
File file, String mode);
Первый из них позволяет указывать имя файла, и
режим mode, в котором открывается файл. Второй
конструктор вместо имени предполагает
использование объекта класса File.
Если файл открывается только для чтения, вы
должны передать конструктору текстовую строку
режима "r". Если же файл открывается и для
чтения, и для записи, конструктору передается
строка "rw".
Позиционирование внутри файла обеспечивается
методом seek, в качестве параметра pos которому
передается абсолютное смещение файла:
public void seek(long pos);
После вызова этого метода текущая позиция в
файле устанавливается в соответствии со
значением параметра pos.
В любой момент времени вы можете определить
текущую позицию внутри файла, вызвав метод
getFilePointer:
public long getFilePointer();
Еще один метод, который имеет отношение к
позиционированию, называется skipBytes:
public int skipBytes(int n);
Он работает так же, как и одноименный метод для
потоков - продвигает текущую позицию в файле на
заданное количество байт.
С помощью метода close вы должны закрывать файл,
после того как работа с им завершена:
public void close();
Метод getFD позволяет получить дескриптор файла:
public final FileDescriptor getFD();
С помощью метода length вы можете определить
текущую длину файла:
public long length();
Ряд методов предназначен для выполнения как
обычного, так и форматированного ввода из файла.
Этот набор аналогичен методам, определенным для
потоков:
public int read();
public int read(byte b[]);
public int read(byte b[],int off,int len);
public final boolean readBoolean();
public final byte readByte();
public final char readChar();
public final double readDouble();
public final float readFloat();
public final void readFully(byte b[]);
public final void readFully(byte b[],
int off, int len);
public final int readInt();
public final String readLine();
public final long readLong();
public final short readShort();
public final int readUnsignedBytee();
public final int readUnsignedShort();
public final String readUTF();
Существуют также методы, позволяющие выполнять
обычную или форматированную запись в файл с
прямым доступом:
public void write(byte b[]);
public void write(byte b[],int off,int len);
public void write(int b);
public final void writeBoolean(boolean v);
public final void writeBytee(int v);
public final void writeBytes(String s);
public final void writeChar(int v);
public final void writeChars(String s);
public final void writeDouble(double v);
public final void writeFloat(float v);
public final void writeInt(int v);
public final void writeLong(long v);
public final void writeShort(int v);
public final void writeUTF(String str);
Имена приведенных методов говорят сами за себя,
поэтому мы не будем их описывать.
|