Файл: Какие существуют виды потоков вводавывода.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.04.2024

Просмотров: 16

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


- Стандартный вывод – производится для вывода данных, полученных в программе пользователя, и обычно экран компьютера используется в качестве стандартного потока вывода, представленного в виде System.out.

- Стандартная ошибка – используется для вывода данных об ошибке, полученной в программе пользователя, чаще всего экран компьютера служит в качестве стандартного потока сообщений об ошибках, представленного в виде System.err.

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

InputStream - абстрактный класс, описывающий поток ввода;

BufferedInputStream - буферизованный входной поток;

ByteArrayInputStream позволяет использовать буфер в памяти (массив байтов) в качестве источника данных для входного потока;

DataInputStream - входной поток для байтовых данных, включающий методы для чтения стандартных типов данных Java;

FileInputStream - входной поток для чтения информации из файла;

FilterInputStream - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства;

ObjectInputStream - входной поток для объектов;

StringBufferInputStream превращает строку (String) во входной поток данных InputStream;

PipedInputStream реализует понятие входного канала;

PushbackInputStream - разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток, позволяет «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации.

SequenceInputStream используется для слияния двух или более потоков InputStream в единый.

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

OutputStream - это абстрактный класс, определяющий потоковый байтовый вывод;

BufferedOutputStream - буферизированный выходной поток;

ByteArrayOutputStream - все данные, посылаемые в этот поток, размещаются в предварительно созданном буфере;


DataOutputStream - выходной поток байт, включающий методы для записи стандартных типов данных Java;

FileOutputStream - запись данных в файл на физическом носителе;

FilterOutputStream - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства;

PrintStream - выходной поток, включающий методы print() и println();

ObjectOutputStream - выходной поток для записи объектов;

PipedOutputStream реализует понятие выходного канала.

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

Reader - абстрактный класс, описывающий символьный ввод;

BufferedReader - буферизованный входной символьный поток;

CharArrayReader - входной поток, который читает из символьного массива;

FileReader - входной поток, читающий файл;

FilterReader - абстрактный класс, предоставляющий интерфейс для классов-надстроек;

InputStreamReader- входной поток, транслирующий байты в символы;

LineNumberReader - входной поток, подсчитывающий строки;

PipedReader - входной канал;

PushbackReader - входной поток, позволяющий возвращать символы обратно в поток;

StringReader - входной поток, читающий из строки.

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

Writer - абстрактный класс, описывающий символьный вывод;

BufferedWriter - буферизованный выходной символьный поток;

CharArrayWriter - выходной поток, который пишет в символьный массив;

FileWriter - выходной поток, пишущий в файл;

FilterWriter - абстрактный класс, предоставляющий интерфейс для классов-надстроек;

OutputStreamWriter
- выходной поток, транслирующий байты в символы;

PipedWriter - выходной канал;

PrintWriter - выходной поток символов, включающий методы print() и println();

StringWriter - выходной поток, пишущий в строку;

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

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

Такая модель взаимодействия объектов возможна в паттерне "Декоратор". В этом паттерне, при создании потока, нужно использовать несколько объектов.

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

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

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

Тип Int необходим для возможности выделять признак конца потока. Т.к. тип byte является знаковым, то его диапазон составляет [-128; 127], ([1000_0000; 0111_1111]), но если этот байт поместить в младший байт типа int, то диапазон значений становится [0; 255].

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

-1 в типе int = 1111_1111__1111_1111__1111_1111__1111_1111 (32 единицы = - 2 147 483 648)
-1 в байте, помещенном в int = 0000_0000__0000_0000__0000_0000__1111_1111
или 255. (8 единиц = 255)

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

Чтобы сериализовать объект класса, мы сначала создаем файл, в который будем записывать объект, затем преобразуем объект в байты и с помощью метода writeObject() сохраняем.

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

При стандартной сериализации, поля с модификатором static не сериализуются. Соответственно, после десериализации это поле значение не поменяет.

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


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

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

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

Иногда нужно на основе существующего объекта создать второй такой же, то есть - создать его клон. Этот процесс в Java называется клонированием.
Клонировать объект в Java можно тремя способами:
1. Переопределение метода clone() и реализация интерфейса Cloneable;

2. Использование конструктора копирования;
3. Использовать для клонирования механизм сериализации;

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

1) Каналы (channel) - открытое соединение с источником или адресатом ввода/вывода.
2) Через каналы осуществляется ввод вывод данных.
3) Вывод данных: вы --> буфер --> канал.
4) Ввод данных: канал --> буфер --> вы

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

Поверхностное копирование
копирует настолько маленькую часть, насколько это возможно. По умолчанию, копирование в Java является поверхностным, т.е Object class не знает о структуре
класса, которого он копирует.
Глубокое копирование дублирует всё. Глубокое копирование — это две коллекции, в одну из которых дублируются все элементы оригинальной коллекции. Мы хотим сделать копию, при которой внесение любых изменений в копию не затронет оригинальную коллекцию.

Чем отличается копирование от клонирования. Можно ли клонировать String, массив String.

При копировании объектов, мы создаем не новый объект, а объект, который ссылается на копируемый. Т.е изменения, которые мы произведем во втором объекте, будут также отражены и в первом.

При клонировании, мы создаем отдельную копию первого объекта, но со своей собственной ссылкой. При этом каждый объект будет иметь свою собственную ссылку.


Класс String представляет неизменяемую строку. Нет смысла клонировать String. Если вы чувствуете, что вам нужно клонировать его, вы можете просто повторно использовать ту же ссылку и добиться того же эффекта.

Даже если бы вы могли clone s1 как s2, тогда s1 != s2 все равно был бы true. Они по-прежнему будут ссылками на отдельные объекты.

Массив String клонировать можно, т.к он реализует интерфейс Cloneable.
**Сериализация

В чём отличие File от Path?

Path, по большому счету, — это переработанный аналог класса File. Работать с ним значительно проще, чем с File.

1. из него убрали многие утилитные (статические) методы, и перенесли их в класс Files.

2. в Path были упорядочены возвращаемые значения методов. В классе File методы возвращали то String, то boolean, то File — разобраться было непросто.

Например, был метод getParent(), который возвращал родительский путь для текущего файла в виде строки. Но при этом был метод getParentFile(), который возвращал то же самое, но в виде объекта File! Это явно избыточно. Поэтому в интерфейсе Path метод getParent() и другие методы работы с файлами возвращают просто объект Path. Никакой кучи вариантов — все легко и просто.

Почему важно закрывать потоки? Какие потоки можно не закрывать (не вызывать метод close())?

При завершении работы с потоком его надо закрыть с помощью метода close(), который определен в интерфейсе Closeable. void close() throws IOException

При закрытии потока освобождаются все выделенные для него ресурсы, например, файл. В случае, если поток окажется не закрыт, может произойти утечка памяти.

Что делает метод available()?

Метод возвращает количество байт, которое еще осталось в потоке.

Можно ли использовать flush() для небуферизированного потока и что будет. Гарантируется ли запись данных в файл при вызове flush()?

Метод flush() для небуферизированного потока использовать можно, т.к исходя из документации, "среда хоста может выполнять свою собственную буферизацию