RandomAccessFile
Класс RandomAccessFile
используется для работы с файлами, содержащими записи известной длины, чтобы можно было использовать метод seek()
для перемещения между записями; затем читать или изменять эти записи. Длина каждой записи может различаться; достаточно знать размер каждой записи и её положение в файле.
Сначала стоит отметить, что нам немного сложно принять тот факт, что RandomAccessFile
не является частью слоёв InputStream
или OutputStream
. Кроме того, что он реализует интерфейсы DataInput
и DataOutput
(которыми также реализуются DataInputStream
и DataOutputStream
), этот класс никак не связан с этими слоями. Он даже не использует возможности существующих классов InputStream
или OutputStream
, а представляет собой совершенно другой класс. Этот класс имеет своё собственное (в большинстве случаев внутреннее) множество методов. Такое решение принято потому, что поведение RandomAccessFile
полностью отличается от других типов ввода/вывода, так как позволяет перемещаться вперед и назад внутри одного файла. Независимо от ситуации, он работает самостоятельно, являясь "непосредственным потомком" объекта.Основополагающе, RandomAccessFile
похож на объединение DataInputStream
и DataOutputStream
. Здесь метод getFilePointer()
используется для получения информации о текущем положении в файле, метод seek()
для перемещения в новую позицию в файле, а метод length()
для определения максимальной длины файла. Кроме того, конструктор требует использования ещё одного параметра (соответствующего C-функции fopen()
), который указывает, является ли файл только для чтения ("r"
), или же для чтения и записи ("rw"
). Поддержка "только для записи" файлов здесь отсутствует. То есть, если бы RandomAccessFile
был наследником DataInputStream
, то он вполне мог бы работать хорошо.Есть и более серьёзные проблемы. Легко представить себе ситуацию, когда нам потребуется поиск в других типах потоков данных, таких как ByteArrayInputStream
, но методы поиска доступны только для RandomAccessFile
. Однако последний может работать только с файлами, а не с потоками данных. В этом случае BufferedInputStream
действительно позволяет нам помечать позицию (используя метод mark()
, значение которого хранится в одной внутренней переменной) и восстанавливать эту позицию с помощью метода reset()
. Но эти подходы имеют ограничения и не являются особенно полезными.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )