Ревью 5. Что такое потоки вводавывода Как это реализовано в Java 3 Классынадстройки потоков вводавывода 4
Скачать 110.73 Kb.
|
В чём отличие File от Path?В Java Path и File — это классы, отвечающие за файловые операции ввода-вывода. Они выполняют одни и те же функции, но относятся к разным пакетам. Класс Path является частью обновления NIO2 , которое появилось в Java с версией 7. Он предоставляет совершенно новый API для работы с вводом-выводом . Более того, как и устаревший класс File , Path также создает объект, который можно использовать для поиска файла в файловой системе . Точно так же он может выполнять все операции , которые можно выполнить с классом File. Вместо использования конструктора, как в случае с File API, мы создаем экземпляр Path , используя статический метод java.nio.file.Paths.get(). Самая распространенная проблема — плохая обработка ошибок. Многие методы не сообщают нам никаких подробностей о возникшей проблеме и даже не выдают исключений. Класс File в пакете java.io плохо поддерживает метаданные, что приводит к проблемам на разных платформах с операциями ввода-вывода, требующими метаинформации о файлах. Метаданные могут также включать разрешения, владельца файла и атрибуты безопасности. Из-за этого класс File вообще не поддерживает символические ссылки , а метод rename() работает неодинаково на разных платформах. Также существует проблема с производительностью, поскольку методы класса File не масштабируются. Это приводит к проблемам с некоторыми каталогами с большим количеством файлов. Перечисление содержимого каталога может привести к зависанию, вызывая проблемы с ресурсами памяти . Наконец, это может привести к отказу в обслуживании. Из-за некоторых из этих недостатков Oracle разработал улучшенный API NIO2. Разработчики должны начинать новые проекты, используя этот новый пакет java.nio вместо устаревших классов, где это возможно. В чем разница между абсолютным и относительным путем?Абсолютный (полный) путь — это путь, который указывает на одно и то же место в файловой системе, вне зависимости от текущей рабочей директории или других обстоятельств. Полный путь всегда начинается с корневого каталога. Относительный путь представляет собой путь по отношению к текущему рабочему каталогу пользователя или активного приложения. Что такое клонирование? Как реализовано клонирование в Java?Использование оператора присваивания не создает нового объекта, а лишь копирует ссылку на объект. Таким образом, две ссылки указывают на одну и ту же область памяти, на один и тот же объект. Для создания нового объекта с таким же состоянием используется клонирование объекта. Класс Object содержит protected метод clone(), осуществляющий побитовое копирование объекта производного класса. Однако сначала необходимо переопределить метод clone() как public для обеспечения возможности его вызова. В переопределенном методе следует вызвать базовую версию метода super.clone(), которая и выполняет собственно клонирование. Чтобы окончательно сделать объект клонируемым, класс должен реализовать интерфейс Cloneable. Интерфейс Cloneable не содержит методов относится к маркерным интерфейсам, а его реализация гарантирует, что метод clone() класса Object возвратит точную копию вызвавшего его объекта с воспроизведением значений всех его полей. В противном случае метод генерирует исключение CloneNotSupportedException. Следует отметить, что при использовании этого механизма объект создается без вызова конструктора. Это решение эффективно только в случае, если поля клонируемого объекта представляют собой значения базовых типов и их обёрток или неизменяемых (immutable) объектных типов. Если же поле клонируемого типа является изменяемым ссылочным типом, то для корректного клонирования требуется другой подход. Причина заключается в том, что при создании копии поля оригинал и копия представляют собой ссылку на один и тот же объект. В этой ситуации следует также клонировать и сам объект поля класса. Такое клонирование возможно только в случае, если тип атрибута класса также реализует интерфейс Cloneable и переопределяет метод clone(). Так как, если это будет иначе вызов метода невозможен из-за его недоступности. Отсюда следует, что если класс имеет суперкласс, то для реализации механизма клонирования текущего класса-потомка необходимо наличие корректной реализации такого механизма в суперклассе. При этом следует отказаться от использования объявлений final для полей объектных типов по причине невозможности изменения их значений при реализации клонирования. Помимо встроенного механизма клонирования в Java для клонирования объекта можно использовать: Специализированный конструктор копирования - в классе описывается конструктор, который принимает объект этого же класса и инициализирует поля создаваемого объекта значениями полей переданного. Фабричный метод - (Factory method), который представляет собой статический метод, возвращающий экземпляр своего класса. Механизм сериализации - сохранение и последующее восстановление объекта в/из потока байтов. |