Главная страница
Навигация по странице:

  • FileOutputStream.write

  • Удаление директорий через общий механизм обхода директорий Files

  • Сериализация

  • Serializable модификатором transient – если не надо сериализовывать 8

  • Externalizable

  • Различия между поверхностным копированием и глубоким копированием

  • 1. Что такое InputStream и OutputStream. На каком паттерне основана иерархия потоков вводавывода


    Скачать 283.25 Kb.
    Название1. Что такое InputStream и OutputStream. На каком паттерне основана иерархия потоков вводавывода
    АнкорFileSystem
    Дата25.10.2022
    Размер283.25 Kb.
    Формат файлаdocx
    Имя файлаfileSystem.docx
    ТипДокументы
    #753698

    1. Что такое InputStream и OutputStream.

    2. На каком паттерне основана иерархия потоков ввода/вывода.

    3) Отличие пакетов IO и NIO, InputStream от Reader.

    4) как работает метод read?

    5) Как создать файл на компьютере с помощью java.

    6) Как удалить директорию с файлами.

    7)  Что такое сериализация и десериализация.

    8) Назовите несколько форматов сериализации.

    9) Как сериализовать объект класса.

    10) Что делать, если одно из полей сериализовывать не нужно.

    11) Как сериализовать статическое поле.

    12) Клонирование объекта. Глубокое и поверхностное.

    1. Что такое InputStream и OutputStream.

    Точно так же, как InputStream – это базовый класс для потоков ввода, класс OutputStream – это базовый класс для потоков вывода.

    2. На каком паттерне основана иерархия потоков ввода/вывода.



    Декоратор — это структурный паттерн, который позволяет добавлять объектам новые поведения на лету, помещая их в объекты-обёртки.

    InputStream это абстрактный класс. Большинство конкретных реализаций, таких как BufferedInputStreamGzipInputStreamObjectInputStream, и т.д., имеют конструктор, который принимает экземпляр того же абстрактного класса. Это ключ распознавания шаблона декоратора (это также относится к конструкторам, использующим экземпляр того же интерфейса).

    При использовании такого конструктора все методы будут делегированы обернутому экземпляру с изменениями в поведении методов. Например, предварительная буферизация потока в памяти, предварительная распаковка потока или интерпретация потока по-другому. У некоторых даже есть дополнительные методы, которые в конечном итоге также делегируют дополнительные функции обернутому экземпляру. Эти методы украшают обернутый экземпляр дополнительным поведением.

    3) Отличие пакетов IO и NIO, InputStream от Reader.



    Потокоориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кэшируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. Если вы хотите произвести подобные манипуляции, вам придется сначала кэшировать данные в буфере.

    Подход, на котором основан Java NIO немного отличается. Данные считываются в буфер для последующей обработки. Вы можете двигаться по буферу вперед и назад. Это дает немного больше гибкости при обработке данных. В то же время, вам необходимо проверять содержит ли буфер необходимый для корректной обработки объем данных. Также необходимо следить, чтобы при чтении данных в буфер вы не уничтожили ещё не обработанные данные, находящиеся в буфере.

    Блокирующий и неблокирующий ввод/вывод


    Потоки ввода/вывода (streams) в Java IO являются блокирующими. Это значит, что когда в потоке выполнения (tread) вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого.

    Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим.


    Тоже самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых данных, но не дожидаться при этом пока они не будут полностью записаны.

    Таким образом неблокирующий режим Java NIO позволяет использовать один поток выполнения для решения нескольких задач вместо пустого прожигания времени на ожидание в заблокированном состояний. Наиболее частой практикой является использование сэкономленного времени работы потока выполнения на обслуживание операций ввода/вывода в другом или других каналах.



    4.

    Метод read() читает один байт из потока и возвращает его.

    5) Как создать файл на компьютере с помощью java.

    Используйте класс java.io.File


    При установлении объекта File вы указываете название файла и дальше используйте метод createNewFile(), который атомарно создает новый пустой файл с названием абстрактного пути, но только в случае, если файл с таким названием не существует.

     Используйте класс java.io.FileOutputStream


    Если хотите создать новый файл и одновременно записать какую-нибудь информацию в нем, можете использовать метод FileOutputStream.write. Этот метод автоматически создает новый файл и записывает в нем контент.

    Используйте Java NIO Files.write()


    Используйте класс Java NIO Files для создания нового файла и записи информации в нем. Этот Java класс представляет метод write(Path path, byte[] bytes, OpenOption… options), который записывает байты к файлу по указанному пути.

    С использованием класса Files возможно создавать, перемещать, копировать, удалять файлы и каталоги. Он также может быть использован для записи и чтения файла.

    Files.write() - это рекомендуемый способ создания файла, так как вам не придется беспокоиться о закрытии ресурсов IO.

    6) Как удалить директорию с файлами.

    Удаление директорий через общий механизм обхода директорий Files.walkFileTree ( рекурсивное удаление)

    7)  Что такое сериализация и десериализация.


    Сериализация — это процесс сохранения состояния объекта в последовательность байт. Десериализация — это процесс восстановления объекта из этих байт.

    интерфейс Serializable

    модификатором transient – если не надо сериализовывать

    8

    Сериализация. Класс ObjectOutputStream


    Для сериализации объектов в поток используется класс ObjectOutputStream. Он записывает данные в поток.

    Для создания объекта ObjectOutputStream в конструктор передается поток, в который производится запись:

    1

    ObjectOutputStream(OutputStream out)

    Класс ObjectInputStream отвечает за обратный процесс - чтение ранее сериализованных данных из потока. В конструкторе он принимает ссылку на поток ввода:

    1

    ObjectInputStream(InputStream in)

    Как сериализовать статическое поле?


    1. Написать в классе свою реализацию методов

    2. writeObject и readObject, вызовите методы defaultReadObject и

    3. defaultWriteObject, которые обрабатывают нормальную

    4. сериализацию, а затем приступить к сериализации и

    5. де-сериализации любых дополнительных полей,

    6. которые вам нужны.

    7. Использовать Externalizable

    Externalizable


    1. Производительность. Интерфейс Serializable имеет много плюсов

    2. (простота, удобство), но производительность не из их числа.
      — Генерит много служебной информации
      — основан на Reflection



    3. Гибкость. Serializable вообще не позволяет управлять процессом,

    4. кроме исключения полей или добавление

    5. (через свою реализацию методов writeObject/readObject).

    6. Безопасность. Иногда необходимо шифрование данных.




    Различия между поверхностным копированием и глубоким копированием


    Давайте завершим эту статью, перечислив несколько основных различий между поверхностным и глубоким копированием объектов в Java:

    1. Поверхностная копия — это побитовая копия объекта, и она отлично работает, если класс содержит только примитивы и неизменяемые поля. Но назначение полей за полем приведет к копированию ссылок (адресов памяти) на изменяемые поля/объекты. Глубокая копия создаст отдельную копию для каждого из изменяемых полей объекта и объектов, на которые ссылаются, а не ссылки на копируемые объекты.

    2. Ссылочные объекты совместно используются в неглубокой копии. Таким образом, если один из объектов изменен, изменение будет видно в другом. С другой стороны, новые объекты создаются для любых объектов, на которые есть ссылки в глубокой копии. Таким образом, если один из объектов изменен, изменение НЕ будет видно в другом.

    3. Глубокое копирование может быть во много раз медленнее поверхностного. Поверхностное копирование предполагает копирование только с одного уровня объекта, тогда как глубокое клонирование включает рекурсивное копирование всех изменяемых типов (включая несколько уровней), что может существенно повлиять на производительность.

    4. Поверхностная копия предпочтительна, если объект состоит только из примитивных и неизменяемых полей. Глубокая копия является предпочтительным подходом по сравнению с поверхностной копией, когда в объекте присутствуют какие-либо объекты, на которые есть ссылки.

    5. Глубокое копирование утомительно в реализации, подвержено ошибкам и сложно в обслуживании. Код необходимо модифицировать каждый раз, когда в поля класса вносятся какие-либо изменения, в отличие от реализации поверхностного копирования.

    6. Реализация по умолчанию Object.clone() создает поверхностную копию объекта. Чтобы создать глубокую копию объекта, нам нужно изменить изменяемые поля объекта, возвращаемые super.clone() прежде чем вернуться к вызывающему абоненту.


    написать администратору сайта