Файл: Потока. В данном случае мы будем говорить о потоке (stream), как об абстракции, которая используется для чтения или записи информации (файлов, сокетов, текста консоли и т д.). Объект, из которого можно считать данные, называется потоком ввода.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.12.2023
Просмотров: 72
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Поверхностное клонирование копирует настолько маленькую часть, насколько это возможно. По умолчанию, копирование в Java является поверхностным. В случае поверхностного клонирования создается новый объект, который имеет точную копию значений в исходном объекте. В этом механизме клонирования объект копируется без содержащихся в нем объектов. Клон копирует только структуру верхнего уровня объекта.
Реализация: необходимо реализовать интерфейс Cloneable. Если этого не сделать, при вызове метода clone() выбросится исключение
CloneNotSupportedException. Интерфейс Cloneable является маркерным (не имеет ни одного метода). Он показывает что объекты класса могут быть клонированы. Метод clone() является protected, поэтому класс может клонировать только собственные объекты. Для того, чтобы клонировать другие объекты, метод clone() нужно расширить до public.
Глубокое клонирование применяется с примитивными и ссылочным и типами. Его используют в тех случаях, когда в клонируемом классе есть изменяемые объекты.
Реализация: все классы-члены в оригинальном классе должны поддерживать клонирование.
Для каждого члена класса должен вызываться super.clone() при переопределении метода clone();
Если какой-либо член класса не поддерживает клонирование, то в методе клонирования необходимо создать новый экземпляр этого класса и скопировать каждый его член со всеми атрибутами в новый объект класса, по одному.
15)
Что такое сериализация и десериализация?
Сериализация — процесс сохранения состояния объекта в последовательность байт.
Для сериализации объектов в поток используется класс
ObjectOutputStream. Он записывает данные в поток.
Десериализация — процесс восстановления объекта из этих байт.
Для десериализации используется класс ObjetInputStream
Любой Java объект можно преобразовать в последовательность байт. Чтобы появилась возможность сериализовать объект, он должен наследовать
интерфейс Serializable. Данный интерфейс не имеет каких-либо методов, а просто дает понять системе, что объект, который реализует его, может быть сериализован.
Какие объекты можно сериализовать?
Классы имплементирующие интерфейс Serializable, поля в этих классах
Как сериализовать объект класса?
Помечаем его маркерным классом Serializable
Создаем файл, в который будем записывать объект
Затем преобразуем объект в байты
Сохраняем с помощью метода writeObject()
Что будет если перед десериализцией изменится класс? Почему будет
выброшено исключение?
Изменится поле private static final long serialVersionUID.
А затем будет выброшено исключение java.io.InvalidClassException. Если же поле создать явно и присвоить значение, то дальше уже всё зависит от того какие изменения произошли в классе, совместимые или не совместимые для сериализации.
Что делать, если одно из полей сериализовывать не нужно?
Чтобы сериализовать определенные поля, можно воспользоваться одним из двух методов:
1. Пометить это поле ключевым словом transient (приоритетно, потому что легче)
2. Использовать интерфейс Externalizable (расширение Seriazable). При использовании слова transient мы явно указываем, какие поля не нужно сериализовывать.
При использовании интерфейса Externalizable нам необходимо переопределить два метода writeExternal() и readExternal(). В методе writeExternal() мы указываем, какие поля будут сериализованы, а в readExternal() как прочитать эти поля
Externalizable vs Serializable
Интерфейс Externalizable расширяет Serializable и позволяет реализовать полностью свой механизм сериализации (стандартно запишется только идентификатор класса)
Простота, удобство – Serializable (весь контроль над сериализацией достается JVM)
Производительность – Externalizable
Гибкость – Externalizable (в Serializable можно только исключать / добавлять поля)
Безопасность – Externalizable (Иногда необходимо шифрование данных)
Что будет при сериализации объекта у которого есть поле и оно не
Serializable?
Код скомпилируется
В процессе выполнения вылетит исключение NotSerializableException
Если это поле находится в классе, от которого наследуется класс, над которым будет проходить сериализация, то это поле должно быть доступно напрямую или через геттеры и сеттеры классу, над которым будет проходить сериализация. В этом классе придется реализовать пользовательскую сериализацию.
Ещё один из приемлемых вариантов — это пометить поле transient, чтобы оно игнорировалось во время процессов сериализации и десериализации
Что если при десериализации поменять тип?
Если при десериализации поменять тип поля, то можно получить исключение ClassCastException.
Особенность сериализации поля final (Можно ли сериализовать и
десериализовать final)?
Поля с модификатором final сериализуются как и обычные. За одним исключением
- их невозможно десериализовать при использовании
Externalizable.
Поскольку final-поля должны быть инициализированы в конструкторе, а после этого в readExternal изменить значение этого поля будет невозможно. Соответственно, если необходимо сериализовать объект с final-полем необходимо использовать только стандартную сериализацию
(Serializable).
16)
Назовите несколько форматов сериализации.
Основные форматы сериализации:
JSON / YAML / XML / BSON
17)
Какие поля не сериализуются?
Помеченные ключевым словом transient и static.
18)
Как сериализовать статическое поле?
При стандартной сериализации, поля с модификатором static не
сериализуются. Соответственно, после десериализации это поле значение не поменяет. При использовании реализации Externalizable сериализовать и десериализовать статическое поле можно, но не рекомендуется этого делать, т.к. это может сопровождаться трудноуловимыми ошибками.
Что такое паттерн проектирования «Адаптер»?
Адаптер - это структурный паттерн проектирования, который позволяет подружить несовместимые объекты. Адаптер это преобразование интерфейса класса в другой интерфейс, который нужен клиенту.
Классическая реализация паттерна Class Adapter подразумевает использование множественного наследования (имплементация интерфейсов)
Пример адаптера и декоратора из IO?
Адаптер в IO - InputStreamReader
Декоратор в IO - BufferedInputStream паттерн Декоратор динамически наделяет объект новыми возможностями и является альтернативой субклассированию в области расширения функциональности
Селекторы
Селекторы в NIO позволяют одному потоку выполнения мониторить несколько каналов ввода.
Вы можете зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи.
Что вы знаете о RandomAccessFile?
Класс RandomAccessFile наследуется напрямую от Object. Предназначен для работы с файлами, поддерживая произвольный доступ к их содержимому.
RandomAccessFile реализует интерфейсы DataInput и DataOutput.
RandomAccessFile содержит методы для чтения и записи примитивов и строк UTF-8.
Метод seek() позволяет переместиться к определенной позиции и изменить хранящееся там значение.
Какие есть режимы доступа к файлу?
RandomAccessFile может открываться в режиме чтения («r») или чтения/записи («rw»).
Также есть режим «rws», когда файл открывается для операций чтения- записи и каждое изменение данных файла немедленно записывается на физическое устройство.
Какие классы позволяют архивировать объекты?
DeflaterOutputStream, InflaterInputStream, ZipInputStream, ZipOutputStream,
GZIPInputStream, GZIPOutputStream
Что вы знаете об интерфейсе FilenameFilter?
Интерфейс FilenameFilter применяется для проверки попадает ли объект
File под некоторое условие.
Этот интерфейс содержит единственный метод boolean accept(File pathName). Этот метод необходимо переопределить и реализовать.
Что такое «каналы»? (файловые каналы)
Канал представляет открытое соединение с источником или адресатом ввода-вывода.
Классы каналов реализуют интерфейс Channel (расширяющий интерфейс
AutoCloseable)
Например, канал типа FileChannel поддерживает методы для получения и установки текущей позиции, передачи данных между файловыми каналами, получения текущего размера канала и его блокировки
Что вы знаете о классах-надстройках?
Классы-надстройки наделяют существующий поток дополнительными свойствами.
Примеры классов: BufferedOutputStream, BufferedInputStream,
BufferedWriter — буферизируют поток и повышают производительность.
Какой класс-надстройка позволяет ускорить чтение/запись за счет
использования буфера?
Для этого используются классы, позволяющие буферизировать поток:
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
Какой класс-надстройка позволяет читать данные из входного
байтового потока в формате примитивных типов данных?
Для чтения байтовых данных (не строк) применяется класс
DataInputStream.
В этом случае необходимо использовать классы из группы InputStream.