Ответы на вопросы на собеседование потоки ввода/вывода в java (часть 1).
- Что такоє символьная ссылка?
Символьная ссылка (Symbolic link, симлинк) - специальный файл в файловой системе, содержащий только текстовую строку с указателем. Эта строка трактуется как путь к файлу, который должен быть открыт при попытке обратиться к данному файлу.
- Какая разница между I/О и NIO?
I/O (input/output, ввод-вывод ) - взаимодействие между обработчиком информации и её поставщиком и/или получателем. Ввод - сигнал или данные, полученные обработчиком, а вывод - сигнал или данные, посланные им (или из него).
NIO (/*в контексте Java*/ Non-blocking I/O, New I/O) - коллекция прикладных программных интерфейсов для языка Java, предназначенных для реализации высокопроизводительных операций ввода-вывода. Также встречается
аббревиатура NIO.2 - она относится к нововведениям относительно этого направления в Java 7.
аббревиатура NIO.2 - она относится к нововведениям относительно этого направления в Java 7.
- Какие особенности NIO вы знаете?
Ключевые особенности NIO:
- Каналы и селекторы: NIO поддерживает различные типы каналов. Канал является абстракцией объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), что позволяет передавать данные с более высокой скоростью. Каналы не блокируются и поэтому Java предоставляет еще такие инструменты, как селектор, который позволяет выбрать готовый канал для передачи данных, и сокет, который является инструментом для блокировки.
- Буферы: в Java 7 была введена буферизация для всех классов-обёрток примитивов (кроме Boolean). Появился абстрактный класс Buffer, который предоставляет такие операции, как clear, flip, mark и т.д. Его подклассы предоставляют методы для получения и установки данных.
- Кодировки: в Java 7 появились кодировки (java.nio.charset), кодеры и декодеры для отображения байт и символов Unicode.
- Какие существуют виды потоков ввода/вывода?
Потоки ввода/вывода используются для передачи данных в файловые потоки, на консоль или на сетевые соединения. Существует два вида потоков ввода/вывода: байтовые и символьные.
- Назовите основные классы потоков ввода/вывода.
Байтовые: java.io.InputStream, java.io.OutputStream;
Символьные: java.io.Reader, java.io.Writer;
- Чем отличаются OutputStream, InputStream, Writer и Reader?
Класс OutputStream - это абстрактный класс, определяющий потоковый байтовый вывод. В этой категории находятся классы, определяющие, куда направляются ваши данные: в массив байтов (но не напрямую в String; предполагается что вы сможете создать их из массива байтов), в файл или канал.
Базовый класс InputStream представляет классы, которые получают данные из различных источников:
- массив байтов
- строка (String)
- файл
- канал (pipe): данные помещаются с одного конца и извлекаются с другого
- последовательность различных потоков, которые можно объединить в одном потоке
- другие источники (например, подключение к интернету)
Символьные потоки имеют два основных абстрактных класса Reader и Writer, управляющие потоками символов Unicode. Класс Reader - абстрактный класс, определяющий символьный потоковый ввод. Класс Writer - абстрактный класс, определяющий символьный потоковый вывод. В случае ошибок все методы класса передают исключение IOException.
- Какие подклассы базового класса InputStream ви знаєте, для чего они предназначены?
- Какие подклассы базового класса InputStream ви знаєте, для чего они предназначены?
Подклассы базового класса InputStream:
- StringBufferInputStream - превращает строку (String) во входной поток данных InputStream.
- SequenceInputStream - сливает два или более потока InputStream в единый поток.
- PushbackInputStream - входной поток, поддерживающий однобайтовый возврат во входной поток.
- PrintStream - выходной поток, включающий методы print() и println().
- PipedInputStream - реализует понятие входного канала.
- ObjectInputStream - входной поток для объектов.
- InputStream - абстрактный класс, описывающий поток ввода.
- FilterInputStream - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства.
- FileInputStream - для чтения информации из файла.
- DataInputStream - входной поток, включающий методы для чтения стандартных типов данных Java.
- ByteArrayInputStream - позволяет использовать буфер в памяти (массив байтов) в качестве источника данных для входного потока.
- BufferedInputStream - буферизированный входной поток.
- Что вы знаете о RandomAccessFile?
RandomAccessFile это класс который наследуется напрямую от Object и не наследуется от вышеприведенных базовых классов ввода\вывода. Предназначен для работы с файлами, поддерживая произвольный доступ к их содержимому.
Работа с классом RandomAccessFile напоминает использование совмещенных в одном классе потоков DataInputStream и DataOutputStream (они реализуют те же интерфейсы DataInput и DataOutput). Кроме того, метод seek() позволяет переместиться к определенной позиции и изменить хранящееся там значение.
При использовании RandomAccessFile необходимо знать структуру файла. Класс RandomAccessFile содержит методы для чтения и записи примитивов и строк UTF-8.
- Какие есть режимы доступа к файлу есть у RandomAccessFile ?
RandomAccessFile может открываться в режиме чтения ("r") или чтения/записи ("rw"). Также есть режим "rws", когда файл открывается для операций чтения-записи и каждое изменение данных файла немедленно записывается на физическое устройство.
- Какие подклассы базового класса OutputStream ви знаєте, для чего они предназначены?
Класс OutputStream - это абстрактный класс, определяющий потоковый байтовый вывод.
В этой категории находятся классы, определяющие, куда направляются ваши данные: в массив байтов (но не напрямую в String; предполагается что вы сможете создать их из массива байтов), в файл или канал.
Подклассы базового класса OutputStream:
- PipedOutputStream - реализует понятие выходного канала.
- ObjectOutputStream - выходной поток для объектов
- FilterOutputStream - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства.
- FileOutputStream - отправка данных в файл на диске. Реализация класса OutputStream.
- DataOutputStream - выходной поток, включающий методы для записи стандартных типов данных Java.
- ByteArrayOutputStream - создает буфер в памяти. Все данные, посылаемые в этот поток, размещаются в созданном буфере.
- BufferedOutputStream - буферизированный выходной поток.
- Для чего используется PushbackInputStream?
Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс PushbackInputStream представляет механизм "заглянуть" во входной поток и увидеть, что оттуда поступит в следующий раз, не извлекая информации.
У класса есть дополнительный метод unread().
- Для чего используется SequenceInputStream?
Класс SequenceInputStream позволяет соединять вместе несколько экземпляров класса InputStream. Конструктор принимает в качестве аргумента либо пару объектов класса InputStream, либо интерфейс Enumeration.
Во время работы класс выполняет запросы на чтение из первого объекта класса InputStream и до конца, а затем переключается на второй. При использовании интерфейса работа продолжится по всем объектам класса InputStream. По достижении конца каждого файла, связанный с ним поток закрывается. Закрытие потока, созданного объектом класса SequenceInputStream, приводит к закрытию всех открытых потоков.
- Какие подклассы базового класса Reader ви знаєте, для чего они предназначены?
Подклассы базового класса Reader:
- StringReader - входной поток, читающий из строки.
- Reader - абстрактный класс, описывающий символьный ввод.
- PushbackReader - входной поток, позволяющий возвращать символы обратно в поток.
- PipedReader - входной канал.
- LineNumberReader - входной поток, подсчитывающий строки.
- InputStreamReader - входной поток, транслирующий байты в символы.
- FilterReader - фильтрующий читатель.
- FileReader - входной поток, читающий файл.
- CharArrayReader - входной поток, который читает из символьного массива.
- BufferedReader - буферизированный входной символьный поток.
PushbackInputStream(InputStream stream, int quantity) может возвращать более одного байта обратно в поток.
ОтветитьУдалитьно только по одному
УдалитьPrintStream относится к OutputStream
ОтветитьУдалитьСпасибо за полезную информацию
ОтветитьУдалитьошибки во всех фразах:"вИ знаЭте" - правильно будет :"вЫ знаЕте", мелочь, но режет глаз.
ОтветитьУдалитьв остальном- очень полезно, Спасибо!