«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Файлы с произвольным доступом

Файлы с произвольным доступом

Опубликовано 1 августа 2024 г.
Просматривать:284

Java предоставляет класс RandomAccessFile, позволяющий читать и записывать данные в любом месте файла. Все потоки, которые вы использовали до сих пор, называются потоками только для чтения или только для записи. Эти потоки называются последовательными потоками. Файл, открываемый с использованием последовательного потока, называется файлом последовательного доступа. Содержимое файла последовательного доступа не может быть обновлено. Однако часто бывает необходимо изменить файлы. Java предоставляет класс RandomAccessFile, позволяющий читать и записывать данные в любом месте файла. Файл, открытый с использованием класса RandomAccessFile, называется файлом произвольного доступа.

Класс RandomAccessFile реализует интерфейсы DataInput и DataOutput, как показано на рисунке ниже. Интерфейс DataInput определяет методы для чтения значений и строк примитивного типа (например, readInt, readDouble, readChar, readBoolean, readUTF), а интерфейс DataOutput определяет методы для записи значений и строк примитивного типа (например, writeInt, writeDouble, writeChar, writeBoolean, writeUTF).

Image description

При создании 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 байта впереди предыдущей позиции, как показано на рисунке ниже.

Image description

Для 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.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/paulike/random-access-files-1464?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3