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

  • Утечка

  • памяти

  • открытые соединения, оставшиеся от ресурсов, потребляют память

  • Flush

  • System.in

  • Пакеты, ориентированные на поток, и пакеты, ориентированные на буфер

  • Блокирующий ввод-вывод против Неблокирующих пакетов ввода-вывода

  • Java IO

  • Клонировать

  • java

  • вопросы по ревью IO. вопросы по ревью 5. Запись на ревью Перед ревью, проверьте себя по контрольным вопросам


    Скачать 41.95 Kb.
    НазваниеЗапись на ревью Перед ревью, проверьте себя по контрольным вопросам
    Анкорвопросы по ревью IO
    Дата14.12.2022
    Размер41.95 Kb.
    Формат файлаdocx
    Имя файлавопросы по ревью 5.docx
    ТипДокументы
    #844702

    Запись на ревью

    Перед ревью, проверьте себя по контрольным вопросам:

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

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

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

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

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

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

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

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

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

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

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

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

    Утечка памяти — это ситуация, когда в куче присутствуют объекты, которые больше не используются, но сборщик мусора не может удалить их из памяти и, таким образом, они сохраняются там без необходимости. Утечка памяти плоха тем, что она блокирует ресурсы памяти и со временем снижает производительность системы.

    КУЧА- Эта область памяти используется для динамического выделения памяти для объектов и классов JRE во время выполнения. Новые объекты всегда создаются в куче, а ссылки на них хранятся в стеке.

    Утечка памяти Через незакрытые ресурсы

    Всякий раз, когда мы создаем новое соединение или открываем поток, JVM выделяет память для этих ресурсов. В качестве примера можно привести соединения с базой данных, входные потоки и объекты сессий.

    Забыв закрыть эти ресурсы, можно заблокировать память, что сделает их недоступными для GC. Это может произойти даже в случае исключения, которое не позволяет программному процессу достичь оператора, выполняющего код для закрытия этих ресурсов.

    В любом случае, открытые соединения, оставшиеся от ресурсов, потребляют память, и если с ними не разобраться, они могут ухудшить производительность и даже привести к ошибке OutOfMemoryError.

    Как предотвратить это?

    • Всегда используйте блок finallyдля закрытия ресурсов

    • Код (даже в блоке finally), закрывающий ресурсы, сам не должен содержать исключений.

    • При использовании Java 7+ можно использовать блок try-with-resources.


    Что вернет метод read(), если он считывает файл и ему встречается байт равный -3 https://ru.stackoverflow.com/questions/1003235/%D0%9A%D0%B0%D0%BA-%D0%B8%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-read-%D1%83-inputstream public class Main { public static void main(String[] args) { byte myByte = -3; // 11111101 byte[] myArray = {myByte}; InputStream in = new ByteArrayInputStream(myArray); int myInt = in.read(); System.out.println(myInt); // 253 } }
    Хорошая статья по утечкам памяти: https://habr.com/ru/company/otus/blog/589321/

     

    Очень хорошая статья про паттерны проектирования ввода-вывода: https://russianblogs.com/article/54631191610/
    Можно ли клонировать String, массив String?

    Класс String представляет неизменяемую строку. Нет смысла клонировать String. Если вы чувствуете, что вам нужно клонировать его, вы можете просто повторно использовать ту же ссылку и добиться того же эффекта.

    Даже если бы вы могли clone s1 как s2, тогда s1 != s2 все равно был бы true. Они по-прежнему будут ссылками на отдельные объекты.

    Массив String клонировать можно, т.к он реализует интерфейс Cloneable.
    Как удалить директорию с файлами? Что если в ней есть вложенные директории?

    Воспользоваться методом класса files.walkfiletree

    Необходимо воспользоваться методом delete(Path path) класса Files. Пример кода: Files.delete(Path.of(“c:\\desktop); Директория будет удалена только если она пустая. Вложенные директории удаляются с помощью рекурсии.

    Выполнится ли flush если мы сделаем close у потока?

    Flush очищает буфер и скидывает содержимое в поток Да, выполнится В соответствии с документами java, вызывая close() на любом потоке java.io, автоматически вызывает flush(). Но я видел много примеров, даже в производственных кодексах разработчики явно использовали flush() непосредственно перед close().
    Гарантируется ли запись данных в файл при вызове flush()?

    Вызов метода flush() гарантирует только то, что байты, ранее записанные в поток, передаются операционной системе для записи, но не гарантирует записи на диск. По идее ничего случиться не должно. 

    Метод flush

    () используется, чтобы принудительно записать в целевой поток данные, которые могут кэшироваться в текущем потоке. Актуально при использовании буферизации и/или нескольких объектах потоков, организованных в цепочку.
    Что такое паттерн адаптер?

    Шаблон позволяет обернуть несовместимые объекты в адаптер, чтобы сделать их совместимыми с другим классом.

    Как реализовано клонирование в Java?

    Поверхностное копирование копирует настолько малую часть информации, насколько это возможно. По умолчанию, клонирование в Java является поверхностным, т.е. Object class не знает о структуре класса, которого он копирует. При клонировании, JVM делает такие вещи:

    1. Если класс имеет только члены примитивных типов, то будет создана совершенно новая копия объекта и возвращена ссылка на этот объект.

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

    Глубокое копирование дублирует все. Глубокое копирование — это две коллекции, в одну из которых дублируются все элементы оригинальной коллекции. Мы хотим сделать копию, при которой внесение изменений в любой элемент копии не затронет оригинальную коллекцию. Глубокое клонирование требует выполнения следующих правил:

    1. Нет необходимости копировать отдельно примитивные данные;

    2. Все классы-члены в оригинальном классе должны поддерживать клонирование. Для каждого члена класса должен вызываться super.clone() при переопределении метода clone();

    3. Если какой-либо член класса не поддерживает клонирование, то в методе клонирования необходимо создать новый экземпляр этого класса и скопировать каждый его член со всеми атрибутами в новый объект класса, по одному.




    Какие плюсы имеет Externalizable?

    Основное преимущество Externalizable перед сериализацией заключается в том, что обо всем позаботится программист, а JVM не имеет никакого контроля. Исходя из наших требований, мы можем сохранить либо весь объект, либо часть объекта, что повышает производительность системы.
    Отличие Scanner’a от BufferedReader’a?

     Класс Scanner - это простой сканер текста, который может анализировать примитивные типы и строки. Он внутренне использует регулярные выражения для чтения различных типов, в то время как, с другой стороны, класс BufferedReader считывает текст из потока ввода символов, буферизуя символы, чтобы обеспечить эффективное чтение последовательности символов

    Эксцентричное различие заключается в чтении различных способов получения входных данных с помощью метода next(), который оправдан в приведенных ниже программах, по аналогичному набору входных данных.
    Ниже приведены основные различия между классом Scanner и BufferedReader в Java

    • BufferedReader является синхронным, а Scanner - нет. BufferedReader следует использовать, если мы работаем с несколькими потоками.

    • BufferedReader имеет значительно больший объем буферной памяти, чем Scanner.

    • У сканера небольшой буфер (1 КБ буфера символов) в отличие от BufferedReader (8 КБ байтового буфера), но этого более чем достаточно.

    • BufferedReader работает немного быстрее по сравнению со Scanner, потому что сканер выполняет синтаксический анализ входных данных, а BufferedReader просто считывает последовательность символов.


    В чём отличие File от Path?

    java.nio.file.Pathявляется частью более современной java.nio.fileбиблиотеки и делает все java.io.Fileвозможное, но, как правило, лучше и больше.
    Что такое канонический путь?

    "Канонический путь" - это тот путь, который будет максимально простым и строгим. "каноничным". То есть, без всех этих странных конструкций.

    Короче говоря, часто бывает, что у вас есть много способов сослаться на одну вещь, и в этом случае вы можете определить каноническое представление , которое является уникальным и что позволяет вам разобраться с коллекциями таких вещей.
    Можно ли сериализовать и десериализовать final переменную с помощью Externalizable?

    При использовании. Serializable они сериализуются и десериализуются как обычно, а вот при использовании. Externalizable десериализовать final - переменную невозможно ! Причина проста: все final - поля инициализируются при вызове конструктора по умолчанию, и после этого их значение уже невозможно изменить. Поэтому для сериализации объектов, содержащих final - поля, используй стандартную сериализацию через Serializable.
    Что такое System.in, что такое System.out?

    System.in является объектом типа InputStream, который обычно подключается к клавиатурному вводу консольных программ.

    System.out - это тип потока печати, используемый для вывода данных на консоль.

    на этом сайте прописан quiz с ответами, может кому поможет https://quizlet.com/ru/567953582/java-%D0%92%D0%B2%D0%BE%D0%B4-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-flash-cards/

     

    Отличная статья о (де)сериализации: http://www.skipy.ru/technics/serialization.html
    Как преобразовать считанные байты в символы? Какой класс для этого используется?

    Превращание потока байт в поток символов


    Reader reader = new InputStreamReader(inputStream, "UTF-8");
    Charset charset = StandardCharsets.UTF_8;

    Writer writer = new OutputStreamWriter(outputStream, charset);

    • Кодировка передается либо строкой, либо объектом типа Charset

    • Charset находится в пакете java.nio.charset

    • Получить дефолтную кодировку системы можно через Charset.defaultCharset()


    Какие поля не сериализуются?

    При стандартной сериализации поля, имеющие модификатор static, не сериализуются. 

    Поля с модификатором final сериализуются как и обычные

    transient
    Отличие пакета io от nio?

    1. Пакеты, ориентированные на поток, и пакеты, ориентированные на буфер:

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


    1. Блокирующий ввод-вывод против Неблокирующих пакетов ввода-вывода:

    Java IO - это блокирующий ввод-вывод. Это означает, что если поток вызывает операцию чтения () или записи (), этот поток блокируется до тех пор, пока не появятся какие-то данные для чтения или данные не будут полностью записаны. Вот почему это синхронный ввод-вывод или блокирующий ввод-вывод.

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

    1. Каналы:

    Канал - это среда для эффективной передачи данных между объектом и буфером. Он действует как шлюз для открытого соединения с источником / приемником данных.

    1. Селектор:

    Селектор выбирает канал среди нескольких каналов ввода-вывода, используя один поток.

    Следующая таблица иллюстрирует различия между Java IO и Java NIO:

    Java IO

    Java NIO

    Java IO означает ввод-вывод Java

    Java NIO означает новый ввод-вывод Java

    Java IO работает внутри java.io упаковка

    Java NIO работает внутри пакета java.nio

    Java IO ориентирован на поток

    Java NIO ориентирован на буфер

    Блокировка операции ввода-вывода

    Неблокирующая операция ввода-вывода

    Каналы недоступны

    Каналы доступны

    Он имеет дело с данными в потоке

    Он имеет дело с данными в блоках

    Не содержит понятия селекторов



    Java IO

    Java NIO

    Java IO означает ввод-вывод Java

    Java NIO означает новый ввод-вывод Java

    Java IO работает внутри java.io упаковка

    Java NIO работает внутри пакета java.nio

    Java IO ориентирован на поток

    Java NIO ориентирован на буфер

    Блокировка операции ввода-вывода

    Неблокирующая операция ввода-вывода

    Каналы недоступны

    Каналы доступны

    Он имеет дело с данными в потоке

    Он имеет дело с данными в блоках

    Не содержит понятия селекторов

    Содержит понятие селекторов


    методы File

     
    Какие интерфейсы реализует InputStream/ OutputStream/ Reader/ Writer?

    InputStream реализует интерфейсы: Closeable и AutoCloseable

    OutputStream реализует интерфейсы: Closeable, Flushable, AutoCloseable

    Reader реализует интерфейсы: Closeable, AutoCloseable, Readable

    Writer реализует интерфейсы: Closeable, Flushable, Appendable, AutoCloseable
    https://quizlet.com/ru/567953582/java-Ввод-вывод-данных-flash-cards/

     

    Какие потоки можно не закрывать (не вызывать метод close())?

    ByteArrayInputStream, ByteArrayOutputStream,
    Что возвращает перегруженный read? Какаое максимальное значение вернет?

    Перегруженный read вернет -1 (65635 байта) , а максимальное значение 65634 байта.
    Что будет при сериализации объекта у которого есть поле и оно не Serializable?

    (не примитивно и не распространяется из сериализуемого интерфейса), то. NotSerializableException будет брошен.

     

    Что такое токен в Scanner?

    Токен

    – это подстрока, не содержащая разделителей и ограниченная слева и справа разделителями. Стандартными разделителями являются: пробел
    3. Три способа клонировать объект?

    Для клонирования объекта в Java можно воспользоваться тремя способами:

    Переопределение метода clone() и реализация интерфейса Cloneable()

    Использование конструктора копирования

    Использовать для клонирования механизм сериализации
    Что в Java можно клонировать?

    Клонировать можно только те объекты, которые реализуют интерфейс java.lang.Cloneable. Данный интерфейс является интерфейсом-марекром, как и java.io.Serializable. Если объект не реализует интерфейс-маркер java.lang.Cloneable, то будет сгенерировано исключение java.lang.CloneNotSupportedException.
    Расскажи про класс File?

    Если классы потоков осуществляют реальную запись и чтение данных, то класс File – это вспомогательный инструмент, призванный обеспечить работу с файлами и каталогами.

    Объект класса File является абстрактным представлением файла и пути к нему. Он устанавливает только соответствие с ним, при этом для создания объекта неважно, существует ли такой файл на диске.
    Как создать новый файл на жестком диске?

    1. Создайте файл с классом java.io.File File.createNewFile()

    2. Создайте файл с классом java.io.FileOutputStream Метод FileOutputStream.write() автоматически создает новый файл и записывает в него содержимое.

    3. Создайте файл с помощью Java.nio.file.Files – Java NIO Files.write()

    4. Создание временного файла с использованием java.io.File.createTempFile()



    Полезно https://younglinux.info/java/file

     

    Можно ли flush() для небуферизированного потока и что будет?

    Метод flush () для небуферезированного потока использовать можно, т.к исходя из документации, "среда хоста может выполнять свою собственную буферизацию, неизвестную Java. В этом случае запись можешь кэшироваться в буферах ОС".
    Пример адаптера и декоратора из IO

    Adapter_pattern:

    java.io.InputStreamReader преобразует поток байтов в поток символов,

     java.io.OutputStreamWriterпреобразует поток символов в поток байтов.

    Decorator: Filter-InputStream, Data-InputStream, feredBuf-InputStream

    Чем отличается копирование от клонирования?)

    При копировании объектов, мы создаем не новый объект, а объект, который ссылается на копируемый. Т.е изменения, которые мы произведем во втором объекте, будут так же отражены и в первом.

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

    Когда Serializable класс имеет цепочку родителей, пока эти родители тоже Serializable, десериализация объекта идет от родителя к наследнику, в обход конструктора. Вместо него вызываются методы readObject (readObjectNoData). Но как только встречается первый предок, не реализующий интерфейс Serializable, инициализация для него возвращается в нормальное русло – вместо readObject вызывается конструктор без аргументов. Если такого конструктора нет, или он объявлен private, исполнение выбросит InvalidClassException.

    При сериализации несериализуемые предки просто игнорируются.

    Если класс несериализуемый и не предоставляет достаточного доступа к своему логическому состоянию для наследников, правильно реализовать его наследника сериализуемым может быть невозможно.

    Популярный вопрос на тему – как когда сериализуешь объект класса-наследника, избежать сериализации его родительской части. Единственный способ добиться этого – кастомизировать сериализационную форму, определив собственную реализацию writeObject(), либо используя интерфейс Externalizable.

    https://habr.com/ru/post/235585/ Неплохая статья про отличия IO и NIO

     
    https://quizlet.com/354783732/inputoutput-flash-cards/ - потоки ввода вывода https://quizlet.com/354897492/Сериализация-flash-cards/ сериализация.

    http://javastudy.ru/interview/input-output/

     

    Какие перегрузки есть у метода read(), как они работают?

    1

    public abstract int read() throws IOException;

    читает последовательно 1 байт из потока

    1

    2

    3

    public int read(byte b[]) throws IOException {

            return read(b, 0, b.length);

        }

    читает из потока массив байт длинной b.length, либо меньше и сохраняет его в буферный массив b.
    Возвращает количество реально переданных байт, либо -1 если поток закончился.

    1

    public int read(byte b[], int off, int len) throws IOException {

    всё то же самое, что и предыдущий, только первый байт помещается в элемент массива b[off], следующий в b[off+1] и т.д.

    Почему возвращает имено такой тип, а не другой?

    Тип Int необходим для возможности выделять признак конца потока. Т.к. тип byte является знаковым, то его диапазон составляет [-128; 127], ([1000_0000; 0111_1111]), но если этот байт поместить в младший байт типа int, то диапазон значений становится [0; 255].
    13) Разница в IO при работе с файлом и директорией.
    Что делает метод available()?


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

    Что если при десериализации поменять тип?

    Если при десериализации поменять тип поля, то можно получить исключение ClassCastException.

    В каких случаях использовать reader и scanner?

    3

    Сходства:

    могут получать данные из текстового файла.

    Различия:

    • Экземпляры класса java.io.BufferedReader предназначены для чтения потока символов с буферизацией (символов, массивов и строк).

    • Экземпляры класса java.util.Scanner предназначены для разбора данных на составляющие с учетом форматов, шаблонов, разных разделителей. Входные данные для Scanner могут быть файлы, потоки байтов, потоки символов, строки.


    23) Конструкторы и методы класса File.
    BuferedReader и BuferedWriter, их методы и отличия от стримов.
    http://topuch.com/blok-primitivnie-tipi/index6.html#pages


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