Ответы на вопросы на собеседование потоки ввода/вывода в java (часть 2).

  • Какие подклассы базового класса Writer ви знаєте, для чего они предназначены?

Подклассы базового класса Writer:
  • Writer - абстрактный класс, описывающий символьный вывод
  • StringWriter - выходной поток, пишущий в строку
  • PrintWriter - выходной поток, включающий методы print() и println()
  • PipedWriter - выходной канал
  • OutputStreamWriter - выходной поток, транслирующий байты в символы
  • FilterWriter - фильтрующий писатель
  • FileWriter - выходной поток, пишущий в файл
  • CharArrayWriter - выходной поток, который пишет в символьный массив
  • BufferedWriter - буферизированный выходной символьный поток

  • Что  такое абсолютный путь и относительный путь?

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

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

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

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

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

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

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

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

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

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

OutputStreamWriter - это мост между классом OutputStream и классом Writer. Символы, записанные в поток, преобразовываются в байты.
InputStreamReader - аналог для чтения. При помощи методов класса Reader читаются байты из потока InputStream и далее преобразуются в символы.

  • В чем отличие класса PrintWriter от PrintStream?

Прежде всего, в классе PrintWriter применен усовершенствованный способ работы с символами UNICODE и другой механизм буферизации вывода.
В классе PrintStream буфер вывода сбрасывался всякий раз, когда вызывался метод print или println. При использовании класса PrintWriter вы можете отказаться от автоматического сброса буферов, выполняя его явным образом при помощи метода flush.
В классе PrintWriter предусмотрено два конструктора, позволяющих работать с выходными потоками класса OutputStream:
  • public PrintWriter(OutputStream out); - создает поток без автоматического сброса буферов.
  • public PrintWriter(OutputStream out, boolean autoFlush); - способ сброса буферов при использовании второго конструктора зависит от значения параметра autoFlush. Если он равен true, автоматический сброс буферов выполняется, а если false - нет.
Набор реализаций основных методов print и println класса PrintWriter аналогичен набору реализация этих методов класса PrintStream.
Здесь же мы упомянем только методы flush и checkError.
Метод flush вызывает принудительный сброс буфера вывода. Если поток PrintWriter создан на базе стандартного потока вывода System.out, то записанные в него данные появятся на консоли только после выполнения сброса буфера (автоматического или сделанного методом flush).
Что же касается метода checkError, то в случае возникновения ошибок он возвращает значение true.

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

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

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

Для различных систем символ разделителя различается. Вытащить его можно используя file.separator, а так же в статическом поле File.separator.  Для Windows это "\".

  • Какие методы класса File ви знаєте?

У класса File очень много методов, перечислим некоторые.
  • getAbsolutePath() - абсолютный путь файла, начиная с корня системы. В Android корневым элементом является символ слеша (/)
  • canRead() - доступно для чтения
  • canWrite() - доступно для записи
  • exists() - файл существует или нет
  • getName() - возвращает имя файла
  • getParent() - возвращает имя родительского каталога
  • getPath() - путь
  • lastModified() - дата последнего изменения
  • isFile() - объект является файлом, а не каталогом
  • isDirectory - объект является каталогом
  • isAbsolute() - возвращает true, если файл имеет абсолютный путь
  • renameTo(File newPath) - переименовывает файл. В параметре указывается имя нового имени файла. Если переименование прошло неудачно, то возвращается false
  • delete() - удаляет файл. Также можно удалить пустой каталог

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

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

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

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

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

0 коментарі :

Отправить комментарий