- Собеседование по Java — потоки ввода/вывода (вопросы и ответы)
- Вопросы
- Ответы
- 1. Какие существуют виды потоков ввода/вывода?
- 2. Назовите основные предки потоков ввода/вывода.
- 3. Что общего и чем отличаются следующие потоки: InputStream, OutputStream, Reader, Writer?
- 4. Что вы знаете о RandomAccessFile?
- 5. Какие есть режимы доступа к файлу?
- 6. В каких пакетах лежат классы-потоки?
- 7. Что вы знаете о классах-надстройках?
- 8. Какой класс-надстройка позволяет читать данные из входного байтового потока в формате примитивных типов данных?
- 9. Какой класс-надстройка позволяет ускорить чтение/запись за счет использования буфера?
- 10. Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
- Почему я получаю «необработанное исключение типа IOException»?
- 5 ответов
Собеседование по Java — потоки ввода/вывода (вопросы и ответы)
Вопросы и ответы для собеседования Java по теме — потоки ввода/вывода.
К списку вопросов по всем темам
Вопросы
1. Какие существуют виды потоков ввода/вывода?
2. Назовите основные предки потоков ввода/вывода.
3. Что общего и чем отличаются следующие потоки: InputStream, OutputStream, Reader, Writer?
4. Что вы знаете о RandomAccessFile?
5. Какие есть режимы доступа к файлу?
6. В каких пакетах лежат классы-потоки?
7. Что вы знаете о классах-надстройках?
8. Какой класс-надстройка позволяет читать данные из входного байтового потока в формате примитивных типов данных?
9. Какой класс-надстройка позволяет ускорить чтение/запись за счет использования буфера?
10. Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
11. Какой класс предназначен для работы с элементами файловой системы (ЭФС)?
12. Какой символ является разделителем при указании пути к ЭФС?
13. Как выбрать все ЭФС определенного каталога по критерию (например, с определенным расширением)?
14. Что вы знаете об интерфейсе FilenameFilter?
15. Что такое сериализация?
16. Какие условия “благополучной” сериализации объекта?
17. Какие классы позволяют архивировать объекты?
Ответы
1. Какие существуют виды потоков ввода/вывода?
Разделяют два вида потоков ввода/вывода: байтовые и символьные.
Система ввода/вывода: http://developer.alexanderklimov.ru/android/java/io.php
Oracle Lesson: Basic I/O tutorial: https://docs.oracle.com/javase/tutorial/essential/io/
2. Назовите основные предки потоков ввода/вывода.
Байтовые: java.io.InputStream, java.io.OutputStream;
Символьные: java.io.Reader, java.io.Writer;
3. Что общего и чем отличаются следующие потоки: InputStream, OutputStream, Reader, Writer?
Базовый класс InputStream представляет классы, которые получают данные из различных источников:
— массив байтов
— строка (String)
— файл
— канал (pipe): данные помещаются с одного конца и извлекаются с другого
— последовательность различных потоков, которые можно объединить в одном потоке
— другие источники (например, подключение к интернету)
Класс OutputStream — это абстрактный класс, определяющий потоковый байтовый вывод. В этой категории находятся классы, определяющие, куда направляются ваши данные: в массив байтов (но не напрямую в String; предполагается что вы сможете создать их из массива байтов), в файл или канал.
Символьные потоки имеют два основных абстрактных класса Reader и Writer, управляющие потоками символов Unicode. Класс Reader — абстрактный класс, определяющий символьный потоковый ввод. Класс Writer — абстрактный класс, определяющий символьный потоковый вывод. В случае ошибок все методы класса передают исключение IOException.
4. Что вы знаете о RandomAccessFile?
Класс RandomAccessFile наследуется напрямую от Object и не наследуется от вышеприведенных базовых классов ввода\вывода. Предназначен для работы с файлами, поддерживая произвольный доступ к их содержимому.
Работа с классом RandomAccessFile напоминает использование совмещенных в одном классе потоков DataInputStream и DataOutputStream (они реализуют те же интерфейсы DataInput и DataOutput). Кроме того, метод seek() позволяет переместиться к определенной позиции и изменить хранящееся там значение.
При использовании RandomAccessFile необходимо знать структуру файла. Класс RandomAccessFile содержит методы для чтения и записи примитивов и строк UTF-8.
5. Какие есть режимы доступа к файлу?
RandomAccessFile может открываться в режиме чтения («r») или чтения/записи («rw»). Также есть режим «rws», когда файл открывается для операций чтения-записи и каждое изменение данных файла немедленно записывается на физическое устройство.
6. В каких пакетах лежат классы-потоки?
Классы потоков ввода\вывода лежат в java.io; С JDK 7 добавлен более современный способ работы с потоками — Java NIO. Классы лежат в java.nio. Для работы с архивами используются классы из пакета java.util.
7. Что вы знаете о классах-надстройках?
Классы-надстройки наделяют существующий поток дополнительными свойствами. Примеры классов: BufferedOutputStream , BufferedInputStream , BufferedWriter — буферизируют поток и повышают производительность.
8. Какой класс-надстройка позволяет читать данные из входного байтового потока в формате примитивных типов данных?
Для чтения байтовых данных (не строк) применяется класс DataInputStream. В этом случае необходимо использовать классы из группы InputStream.
Для преобразования строки в массив байтов, пригодный для помещения в поток ByteArrayInputStream, в классе String предусмотрен метод getBytes(). Полученный ByteArrayInputStream представляет собой поток InputStream, подходящий для передачи DataInputStream.
При побайтовом чтении символов из форматированного потока DataInputStream методом readByte() любое полученное значение будет считаться действительным, поэтому возвращаемое значение неприменимо для идентификации конца потока. Вместо этого можно использовать метод available(), который сообщает, сколько еще осталось символов.
Класс DataInputStream позволяет читать элементарные данные из потока через интерфейс DataInput, который определяет методы, преобразующие элементарные значения в форму последовательности байтов. Такие потоки облегчают сохранение в файле двоичных данных.
Конструктор: DataInputStream(InputStream stream)
Методы: readDouble(), readBoolean(), readInt()
9. Какой класс-надстройка позволяет ускорить чтение/запись за счет использования буфера?
Для этого используются классы, позволяющие буферизировать поток:
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)
10. Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
OutputStreamWriter — мост между классом OutputStream и классом Writer. Символы, записанные в поток, преобразовываются в байты.
Почему я получаю «необработанное исключение типа IOException»?
есть ли у кого-нибудь идеи, почему? Я просто попытался упростить код, указанный на веб-сайте сумму (здесь). Я слишком упрощаю?
5 ответов
вы должны добавить «throws IOException» в свой основной метод:
public static void main(String[] args) throws IOException
вы можете прочитать немного больше о проверенных исключениях (которые специфичны для Java) в JLS.
Java имеет функцию под названием «проверенные исключения». Это означает, что существуют определенные виды исключений, а именно те, которые подкласс Exception но не RuntimeException, такие, что если метод может бросить их, это должны перечислите их в объявлении бросков, скажем: void readData () бросает IOException. IOException является одним из них.
таким образом, когда вы вызываете метод, который перечисляет IOException в его объявлении бросков, вы должны либо перечислить его в своих собственных бросках объявление или поймать его.
обоснование наличия проверенных исключений заключается в том, что для некоторых видов исключений вы не должны игнорировать тот факт, что они могут произойти, потому что их появление-довольно обычная ситуация, а не ошибка программы. Таким образом, компилятор помогает вам не забывать о возможности возникновения такого исключения и требует, чтобы вы каким-то образом его обрабатывали.
однако не все проверенные классы исключений в стандартной библиотеке Java подходят под это обоснование, но это совсем другая тема.
повторите попытку с этим фрагментом кода:
import java.io.*; class IO < public static void main(String[] args) < try < BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String userInput; while ((userInput = stdIn.readLine()) != null) < System.out.println(userInput); >> catch(IOException ie) < ie.printStackTrace(); >> >
используя try-catch-finally лучше, чем при использовании throws . Поиск ошибок и отладка проще, когда вы используете try-catch-finally .
чтение ввода с клавиатуры аналогично загрузке файлов из интернета, система Java io открывает соединения с источником данных для чтения с помощью InputStream или Reader, вы должны справиться с ситуацией, когда соединение может разорвать с помощью IOExceptions
Если вы хотите точно знать, что значит работать с InputStreams и BufferedReader видео показывает
добавьте «throws IOException» в свой метод следующим образом:
public static void main(String args[]) throws IOException