Ответы на вопросы на собеседование потоки ввода/вывода в 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 вы знаете?

Ключевые особенности 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:
  • 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 - буферизированный входной символьный поток.

Потоки ввода/вывода в java (часть 2).

Рассказать друзьям:

3 коментарі :

  1. PushbackInputStream(InputStream stream, int quantity) может возвращать более одного байта обратно в поток.

    ОтветитьУдалить
  2. PrintStream относится к OutputStream

    ОтветитьУдалить