Ревью 5. Что такое потоки вводавывода Как это реализовано в Java 3 Классынадстройки потоков вводавывода 4
Скачать 110.73 Kb.
|
Что такое потоки ввода-вывода? Как это реализовано в Java?Поток ввода/вывода - это абстрактное понятие источника или приёмника данных, которые способны передавать информацию. Имеется два вида потоков ввода/вывода : байтовые и символьные. К байтовым потокам относятся java.io.InputStream, java.io.OutputStream. Символьные потоки – java.io.Reader, java.io.Writer. Данные потоки включены в пакет java.io. Базовый класс InputStream и его наследники получают данные из различных источников : массив байтов, строки (String), файлы, каналы pipe, у которых одна из сторон является входом, а вторая сторона играет роль выхода и т.д. Абстрактный класс OutputStream определяет байтовый поток вывода. К этой категории относятся классы, определяющие выходные данные, помещаемые в массив байтов, в файл или канал. Напрямую в объект String вывести данные из OutputStream нельзя, можно создать текстовую строку (String) из массива байтов. Символьные потоки включают два основных абстрактных класса Reader и Writer, управляющие потоками Unicode символов. Класс Reader определяет символьный поток ввода. Класс Writer определяет символьный поток вывода. При возникновении ошибки методы данных классов вызывают исключение IOException. Потоки ввода данных включают методы read () для чтения отдельных байтов или массива байтов. Потоки вывода данных включают методы write () для записи одиночных байтов или массива байтов. Поток — это некая абстракция производства или потребления информации. С физическим устройством поток связывает система ввода-вывода. Все потоки действуют одинаково — даже если они связаны с разными физическими устройствами. Поэтому классы и методы ввода-вывода могут применяться к самым разным типам устройств. Например, методами вывода на консоль можно пользоваться и для вывода в файл на диске. Для реализации потоков используется иерархия классов, содержащихся в пакете java.io. Классы-надстройки потоков ввода/выводаК классам-надстройкам относятся классы, наследующие свойства базовых классов и расширяющие их свойства. В качестве примеров можно привести классы BufferedOutputStream, BufferedInputStrem, BufferedWriter, BufferedReader, которые буферезируют поток, повышая, таким образом, производительность. Назовите основные классы потоков ввода/вывода.Разделяют два вида потоков ввода/вывода: байтовые - java.io.InputStream, java.io.OutputStream; символьные - java.io.Reader, java.io.Writer. В каких пакетах расположены классы потоков ввода/вывода?java.io, java.nio. Для работы с потоками компрессированных данных используются классы из пакета java.util.zip Существует ли возможность перенаправить потоки стандартного ввода/вывода?Для различных операционных систем символ разделителя различается. Для Windows это \, для Linux - /. В Java получить разделитель для текущей операционной системы можно через обращение к статическому полю File.separator. Отличие пакета io от nio?В чём заключается разница между IO и NIO?Java IO (input-output) является потокоориентированным, а Java NIO (new/non-blocking io) – буфер-ориентированным. Потокоориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кэшируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. В Java NIO данные сначала считываются в буфер, что дает больше гибкости при обработке данных. Потоки ввода/вывода в Java IO являются блокирующими. Это значит, что когда в потоке выполнения вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим. Тоже самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых данных, но не дожидаться при этом пока они не будут полностью записаны. В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т.е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи. |