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

  • ОТВЕТ

  • Input_Output Ревью. Какие существуют виды потоков вводавывода Назовите основные предки потоков вводавывода


    Скачать 47.38 Kb.
    НазваниеКакие существуют виды потоков вводавывода Назовите основные предки потоков вводавывода
    АнкорInput_OutPut Review
    Дата05.10.2022
    Размер47.38 Kb.
    Формат файлаdocx
    Имя файлаInput_Output Ревью.docx
    ТипДокументы
    #715083
    страница2 из 3
    1   2   3



    INPUT/OUTPUT здорового человека

    ВОПРОС

    ОТВЕТ

    Какие существуют виды потоков ввода/вывода?

    Разделяют два вида потоков ввода/вывода: байтовые и символьные.

    Система ввода/вывода: http://developer.alexanderklimov.ru/android/java/io.php
    Oracle Lesson: Basic I/O tutorial: https://docs.oracle.com/javase/tutorial/essential/io/

    Назовите основные предки потоков ввода/вывода.

    Байтовые: java.io.InputStream, java.io.OutputStream;
    Символьные: java.io.Reader, java.io.Writer;

    Что общего и чем отличаются следующие потоки: InputStream, OutputStream, Reader, Writer?

    Базовый класс InputStream представляет классы, которые получают данные из различных источников:- массив байтов- строка (String)- файл- канал (pipe): данные помещаются с одного конца и извлекаются с другого- последовательность различных потоков, которые можно объединить в одном потоке- другие источники (например, подключение к интернету)
    Класс OutputStream - это абстрактный класс, определяющий потоковый байтовый вывод. В этой категории находятся классы, определяющие, куда направляются ваши данные: в массив байтов (но не напрямую в String; предполагается что вы сможете создать их из массива байтов), в файл или канал.
    Символьные потоки имеют два основных абстрактных класса Reader и Writer, управляющие потоками символов Unicode. Класс Reader - абстрактный класс, определяющий символьный потоковый ввод. Класс Writer - абстрактный класс, определяющий символьный потоковый вывод. В случае ошибок все методы класса передают исключение IOException.

    Что вы знаете о RandomAccessFile?

    Класс RandomAccessFile наследуется напрямую от Object и не наследуется от вышеприведенных базовых классов ввода\вывода. Предназначен для работы с файлами, поддерживая произвольный доступ к их содержимому.
    Работа с классом RandomAccessFile напоминает использование совмещенных в одном классе потоков DataInputStream и DataOutputStream (они реализуют те же интерфейсы DataInput и DataOutput). Кроме того, метод seek() позволяет переместиться к определенной позиции и изменить хранящееся там значение.
    При использовании RandomAccessFile необходимо знать структуру файла. Класс RandomAccessFile содержит методы для чтения и записи примитивов и строк UTF-8.

    Какие есть режимы доступа к файлу?

    RandomAccessFile может открываться в режиме чтения ("r") или чтения/записи ("rw"). Также есть режим "rws", когда файл открывается для операций чтения-записи и каждое изменение данных файла немедленно записывается на физическое устройство.

    В каких пакетах лежат классы-потоки?

    Классы потоков ввода\вывода лежат в java.io; С JDK 7 добавлен более современный способ работы с потоками - Java NIO. Классы лежат в java.nio. Для работы с архивами используются классы из пакета java.util.

    Что вы знаете о классах-надстройках?

    Классы-надстройки наделяют существующий поток дополнительными свойствами. Примеры классов: BufferedOutputStream, BufferedInputStream, BufferedWriter - буферизируют поток и повышают производительность.

    Какой класс-надстройка позволяет читать данные из входного байтового потока в формате примитивных типов данных?

    Для чтения байтовых данных (не строк) применяется класс DataInputStream. В этом случае необходимо использовать классы из группы InputStream.
    Для преобразования строки в массив байтов, пригодный для помещения в поток ByteArrayInputStream, в классе String предусмотрен метод getBytes(). Полученный ByteArrayInputStream представляет собой поток InputStream, подходящий для передачи DataInputStream.
    При побайтовом чтении символов из форматированного потока DataInputStream методом readByte() любое полученное значение будет считаться действительным, поэтому возвращаемое значение неприменимо для идентификации конца потока. Вместо этого можно использовать метод available(), который сообщает, сколько еще осталось символов.
    Класс DataInputStream позволяет читать элементарные данные из потока через интерфейс DataInput, который определяет методы, преобразующие элементарные значения в форму последовательности байтов. Такие потоки облегчают сохранение в файле двоичных данных.
    Конструктор: DataInputStream(InputStream stream)Методы: readDouble(), readBoolean(), readInt()

    Какой класс-надстройка позволяет ускорить чтение/запись за счет использования буфера?

    Для этого используются классы, позволяющие буферизировать поток:java.io.BufferedInputStream(InputStream in) || BufferedInputStream(InputStream in, int size),java.io.BufferedOutputStream(OutputStream out) || BufferedOutputStream(OutputStream out, int size),java.io.BufferedReader(Reader r) || BufferedReader(Reader in, int sz),java.io.BufferedWriter(Writer out) || BufferedWriter(Writer out, int sz)

    Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?

    1) OutputStreamWriter - мост между классом OutputStream и классом Writer. Символы, записанные в поток, преобразовываются в байты.

    2) InputStreamReader - аналог для чтения. При помощи методов класса Reader читаются байты из потока InputStream и далее преобразуются в символы.

    Какой класс предназначен для работы с элементами файловой системы (ЭФС)?

    В отличие от большинства классов ввода/вывода, класс File работает не с потоками, а непосредственно с файлами. Данный класс позволяет получить информацию о файле: права доступа, время и дата создания, путь к каталогу. А также осуществлять навигацию по иерархиям подкаталогов. Класс java.io.File может представлять имя определённого файла, а также имена группы файлов, находящихся в каталоге. Если класс представляет каталог, то его метод list() возвращает массив строк с именами всех файлов.
    Для создания объектов класса File можно использовать один из следующих конструкторов:File(File dir, String name) - указывается объект класса File (каталог) и имя файлаFile(String path) - указывается путь к файлу без указания имени файлаFile(String dirPath, String name) - указывается путь к файлу и имя файлаFile(URI uri) - указывается объекта URI, описывающий файл

    Какой символ является разделителем при указании пути к ЭФС?

    Для различных систем символ разделителя различается. Вытащить его можно используя file.separator, а так же в статическом поле File.separator. Для Windows это '\'.
    *На stackoverflow встречал утверждение со ссылкой на документацию, что можно безопасно использовать слэш '/' для всех систем. В комментарии читатель подтвердил это.

    Что вы знаете об интерфейсе FilenameFilter?

    Интерфейс FilenameFilter применяется для проверки попадает ли объект File под некоторое условие. Этот интерфейс содержит единственный метод boolean accept(File pathName). Этот метод необходимо переопределить и реализовать.

    Что такое сериализация?

    Сериализация это процесс сохранения состояния объекта в последовательность байт; десериализация это процесс восстановления объекта, из этих байт. Java Serialization API предоставляет стандартный механизм для создания сериализуемых объектов.

    Какие условия "благополучной" сериализации объекта?

    Чтобы обладать способностью к сериализации, класс должен реализовывать интерфейс-метку Serializable. Так же все атрибуты и подтипы сериализуемого класса должны быть сериализуемы. Если класс предок был несереализуемым, то этот суперкласс должен содержать доступный (public, protected) конструктор без параметров для инициализации полей.

    Какие классы позволяют архивировать объекты?

    DeflaterOutputStream, InflaterInputStream, ZipInputStream, ZipOutputStream, GZIPInputStream, GZIPOutputStream.

    Основные отличия между Java IO и Java NIO

    IO
    1) Блокирующий ввод-вывод
    Потоки ввода/вывода (streams) в Java IO являются блокирующими. Это значит, что когда в потоке выполнения (tread) вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого.
    2) Потокоориентированный ввод-вывод.
    Потокоориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кэшируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. Если вы хотите произвести подобные манипуляции, вам придется сначала кэшировать данные в буфере.

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

    В чем отличие Scanner от BufferedReader?

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

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

    Это поле нужно пометить ключевым словом transient.
    И оно не будет сериализовано.

    Как сериализовать объект класса?

    Нужно пометить его маркерным классом Serializable

    Какие форматы сериализации существуют?

    1. JSON
    JavaScript Object Notation
    2. XML
    3. BinarySON - тот же JSON только в двоичном представлении.
    4. YAML - Yet Another Markup Language

    Cтандартные потоки ввода/вывода?

    В языке Java стандартный поток ввода представлен переменной System.in. Эта переменная (объект) имеет тип InputStream. Класс InputStream есть абстрактный и размещается в вершине иерархии классов ввода.

    Стандартный поток вывода ассоциируется с переменной (объектом) System.out, тип которой PrintStream. Класс PrintStream содержит методы вывода на консоль print() и println().

    Классы байтовых потоков ввода и что они делают?

    Классы, которые реализуют байтовые потоки ввода унаследованы от абстрактного класса InputStream:
    InputStream - абстрактный класс, который описывает поток ввода. Данный класс есть базовым для всех других классов системы ввода;
    BufferedInputStream - класс, который описывает буферизованные поток ввода;
    ByteArrayInputStream - класс, который описывает поток ввода, читающий байты из массива;
    DataInputStream -класс, который реализует методы для чтения данных стандартных типов, определенных в Java (int, double, float и т.д.);
    FileInputStream - класс, который реализует поток ввода, который читает данные из файла;
    FilterInputStream - это реализация абстрактного класса InputStream;
    ObjectInputStream - класс, реализующий поток ввода объектов;
    PipedInputStream - класс, соответствующий каналу ввода;
    PushbackInputStream - класс, соответствующий потоку ввода, который поддерживает возврат одного байта обратно в поток ввода;
    SequenceInputStream - класс, который реализует поток ввода, состоящий из двух или более потоков ввода, данные из которых читаются поочередно.

    Классы байтовых потоков вывода и что они делают?

    Классы, которые реализуют байтовые потоки вывода унаследованы от абстрактного класса OutputStream:
    OutputStream - абстрактный класс, который описывает поток вывода. Все другие классы системы вывода есть подклассами класса OutputStream;
    BufferedOutputStream - класс, который имплементирует буферизованный поток вывода;
    ByteArrayOutputStream - класс, который реализует поток вывода, записывающий байты в массив;
    DataOutputStream - класс, который реализует поток вывода, содержащий методы для чтения данных стандартных типов, определенных в Java (int, float, double и т.п.);
    FileOutputStream - класс, который соответствует потоку вывода записывающему данные в файл;
    FilterOutputStream - класс, реализующий абстрактный класс OutputStream;
    ObjectOutputStream - класс, соответствующий потоку вывода объектов;
    PipedOutputStream - класс, который ассоциируется с каналом вывода;
    PrintStream - класс, который представляет собой поток вывода, содержащий методы print() и println().

    Классы символьных потоков ввода и что они делают?

    Reader - абстрактный класс, описывающий поток ввода символов. Этот класс есть суперклассом для всех нижеследующих подклассов;
    BufferedReader - класс, который описывает буферизованный поток ввода символов;
    CharArrayReader - класс, который реализует поток ввода, читающий символы из массива;
    FileReader - класс, который описывает поток ввода связанный с символьным файлом;
    FilterReader - класс, представляющий фильтрованный поток чтения;
    InputStreamReader - класс, который представляет собой поток ввода, превращающий байты в символы;
    LineNumberReader - класс, соответствующий потоку ввода, который подсчитывает строки;
    PipedReader - класс, который ассоциируется с каналом ввода;
    PushbackReader - класс, соответствующий потоку ввода, который позволяет возвращать символы обратно в поток ввода;
    StringReader - класс, который реализует поток ввода, читающий символы из строки.

    Классы символьных потоков вывода и что они делают?

    Writer - абстрактный класс, описывающий поток вывода символов. Все нижеследующие классы являются подклассами класса Writer;
    BufferedWriter - класс, который описывает буферизованный поток вывода символов;
    CharArrayWriter - класс, который соответствует потоку вывода, записывающему символы в массив;
    FileWriter - класс, который соответствует потоку вывода, записывающему символы в файл;
    FilterWriter - класс, реализующий фильтрованный поток записи;
    OutputStreamWriter - класс, реализующий средства преобразования символов в байты;
    PipedWriter - класс, который ассоциируется с каналом вывода;
    StringWriter - класс, который реализует поток вывода, записывающий символы в строку.

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

    Объекты классов Java, которые используются для ввода/вывода, для обеспечения необходимой функциональности наслаиваются друг на друга. Такая модель взаимодействия объектов поддерживается в паттерне «Декоратор». В этом паттерне при создании потока нужно использовать несколько объектов.

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

    Метод read() - возвращает значение целого типа очередного символа, доступного во входном потоке; Метод read(byte arr) - метод для массового считывания данных, который считывает максимум байтов (не более arr.length) из потока, входящих данных в аргумент массива arr и возвращает фактическое количество байтов, считанных из потока;

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

    Класс должен имплементировать маркерный интерфейс Serializable. Создаем ObjectOutputStream и передаем ему OutputStream/

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

    При стандартной сериализации поля, имеющие модификатор static, не сериализуются. Соответственно, после десериализации это поле значения не меняет. При использовании реализации Externalizable сериализовать и десериализовать статическое поле можно, но не рекомендуется этого делать, т.к. это может сопровождаться трудноуловимыми ошибками.

    Можно ли сериализовать final поле?

    Поля с модификатором final сериализуются как и обычные. За одним исключением - их невозможно десериализовать при использовании Externalizable, поскольку final-поля должны быть инициализированы в конструкторе, а после этого в readExternal изменить значение этого поля будет невозможно. Соответственно, если необходимо сериализовать объект с final-полем неоходимо использовать только стандартную сериализацию.

    Типы клонирования объектов в Java

    Java поддерживает два типа клонирования — поверхностное клонирование и глубокое клонирование.
    1) В случае поверхностного клонирования создается новый объект, который имеет точную копию значений в исходном объекте. Метод clone () объекта обеспечивает поверхностное клонирование. В этом механизме клонирования объект копируется без содержащихся в нем объектов.
    Клон копирует только структуру верхнего уровня объекта, а не нижние уровни.

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

    Что такое «каналы»?

    Каналы (channels) - это логические (не физические) порталы, абстракции объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), через которые осуществляется ввод/вывод данных, а буферы являются источниками или приёмниками этих переданных данных. При организации вывода, данные, которые необходимо отправить, помещаются в буфер, который затем передается в канал. При вводе, данные из канала помещаются в заранее предоставленный буфер.
    Каналы напоминают трубопроводы, по которым эффективно транспортируются данные между буферами байтов и сущностями по ту сторону каналов. Каналы - это шлюзы, которые позволяют получить доступ к сервисам ввода/вывода операционной системы с минимальными накладными расходами, а буферы - внутренние конечные точки этих шлюзов, используемые для передачи и приема данных.

    Потоки (streams) применительно к вводу/выводу и работе с файлами.

    Абстракция, которая используется для чтения или записи информации (файлов, сокетов, текста консоли и т.д.).

    Что делает метод read? Почему он возвращает int а не byte? Почему он не может возвращать byte?

    Метод читает следующий байт из входящего потока. Когда метод ничего не может считать (конец потока), возвращается -1.
    Потому что нужно нужен такой тип, который может вместить 1 байт, плюс одно служебное значение -1 (обозначающее конец потока)
    Диапазон byte в Java лежит от -128 до 127, а возвращаемое значение метода read() лежит в диапазоне от 0 до 255.

    Что вернет метод read(), если он считывает файл и ему встречается байт равный -1?

    255

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

    В первую очередь необходимо реализовать интерфейс Cloneable. Если этого не сделать, при вызове метода clone() выбросится исключение CloneNotSupportedException. Интерфейс Cloneable является маркерным, то есть не имеет ни одного метода. Он показывает что объекты класса могут быть клонированы. Метод clone() является protected, поэтому класс может клонировать только собственные объекты. Для того, чтобы клонировать другие объекты, метод clone() нужно расширить до public.
    Пример клонирования:
    public User clone() {
    return (User) super.clone();

    Поверхностное и глубокое клонирование.

    Поверхностное клонирование применяется только с примитивными полями.
    Глубокое с примитивными и ссылочными.
    1   2   3


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