1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-thinking-in-java-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
10.3 本身的缺陷:RandomAccessFile.md 4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 11.03.2025 09:15 d56454c

10.3 Внутренние недостатки: 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-thinking-in-java-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-thinking-in-java-zh.git
oschina-mirror
wizardforcel-thinking-in-java-zh
wizardforcel-thinking-in-java-zh
master