Java предоставляет класс RandomAccessFile, позволяющий читать и записывать данные в любом месте файла. Все потоки, которые вы использовали до сих пор, называются потоками только для чтения или только для записи. Эти потоки называются последовательными потоками. Файл, открываемый с использованием последовательного потока, называется файлом последовательного доступа. Содержимое файла последовательного доступа не может быть обновлено. Однако часто бывает необходимо изменить файлы. Java предоставляет класс RandomAccessFile, позволяющий читать и записывать данные в любом месте файла. Файл, открытый с использованием класса RandomAccessFile, называется файлом произвольного доступа.
Класс RandomAccessFile реализует интерфейсы DataInput и DataOutput, как показано на рисунке ниже. Интерфейс DataInput определяет методы для чтения значений и строк примитивного типа (например, readInt, readDouble, readChar, readBoolean, readUTF), а интерфейс DataOutput определяет методы для записи значений и строк примитивного типа (например, writeInt, writeDouble, writeChar, writeBoolean, writeUTF).
При создании RandomAccessFile вы можете указать один из двух режимов: r или rw. Режим r означает, что поток доступен только для чтения, а режим rw указывает, что поток допускает как чтение, так и запись. Например, следующий оператор создает новый поток raf, который позволяет программе читать и записывать в файл test.dat:
RandomAccessFile raf = новый RandomAccessFile("test.dat", "rw");
Если test.dat уже существует, для доступа к нему создается raf; если test.dat не существует, создается новый файл с именем test.dat и создается raf для доступа к новому файлу. Метод raf.length() возвращает количество байтов в test.dat в любой момент времени. Если вы добавите в файл новые данные, raf.length() увеличится.
Если файл не предназначен для изменения, откройте его в режиме r. Это предотвращает непреднамеренное изменение файла.
Файл произвольного доступа состоит из последовательности байтов. Специальный маркер, называемый указателем файла, располагается в одном из этих байтов. Операция чтения или записи выполняется в месте расположения указателя файла. Когда файл открывается, указатель файла устанавливается в начало файла. Когда вы читаете или записываете данные в файл, указатель файла перемещается вперед к следующему элементу данных. Например, если вы читаете значение int с помощью readInt(), JVM считывает 4 байта из указателя файла, и теперь указатель файла равен ]4 байта впереди предыдущей позиции, как показано на рисунке ниже.
Для RandomAccessFile raf вы можете использовать метод raf.seek(position) для перемещения указателя файла в указанную позицию. raf.seek(0) перемещает его в начало файла, а raf.seek(raf.length()) перемещает его в конец файла. Код ниже демонстрирует RandomAccessFile.
package demo; import java.io.*; public class TestRandomAccessFile { public static void main(String[] args) throws IOException { try( // Create a random access file RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw"); ) { // Clear the file to destroy the old contents if exists inout.setLength(0); // Write new integers to the file for(int i = 0; iТекущая длина файла — 800
Первое число — 0
Второе число — 1
Десятое число — 9
Новая длина — 804
Одиннадцатое число — 555Для файла с именем inout.dat создается RandomAccessFile с режимом rw, чтобы разрешить операции чтения и записи в строке 8.
inout.setLength(0) устанавливает длину в 0 в строке 11. Это, по сути, уничтожает старое содержимое файла.
Цикл for записывает 200 значений int от 0 до 199 в файл в строках 14 и 15. Поскольку каждый [ Значение &&&]int занимает 4 байт, общая длина файла, возвращаемого из inout.length(), теперь равна 800 (строка 18), как показано в примере вывода.
Вызовinout.seek(0) в строке 21 устанавливает указатель файла в начало файла. inout.readInt() считывает первое значение в строке 22 и перемещает указатель файла на следующее число. Второе число читается в строке 26.
inout.seek(9 * 4) (строка 29) перемещает указатель файла на десятое число. inout.readInt() считывает десятое число и перемещает указатель файла на одиннадцатое число в строке 30. inout.write(555) записывает новое одиннадцатое число в текущую позицию ( строка 33). Предыдущий одиннадцатый номер уничтожен.
inout.seek(inout.length()) перемещает указатель файла в конец файла (строка 36). inout.writeInt(999) записывает в файл 999 (строка 37). Теперь длина файла увеличивается на 4, поэтому inout.length() возвращает 804 (строка 40).
inout.seek(10 * 4) перемещает указатель файла на одиннадцатое число в строке 43. Новое одиннадцатое число, 555, отображается в строке 44.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3