java что такое inputstream и outputstream

Java 8 потоки ввода/вывода

Содержание

Введение

Поток ввода/вывода (I/O Stream) представляет собой источник данных или место их назначения. Потоки могут представлять собой абсолютно различные источники и места назначения: файлы на диска, устройства, сеть, другие программы, массивы в памяти т. д.

Потоки поддерживают большое количество различных типов данных: байты, примитивные типы, локализованные символы, объекты. Некоторые потоки просто передают данные, другие изменяют в соответствии со своими потребностями.

Независимо от внутреннего устройства потоки представляют собой одинаковую модель для программы. Поток представляет собой последовательность данных.

Потоки байт

Диаграмма классов, показывающая иерархию основных дочерних классов для класса java.io.InputStream

java что такое inputstream и outputstream

Диаграмма классов, показывающая иерархию основных дочерних классов для класса java.io.OutputStream

java.io.InputStream

Абстрактный класс, являющийся базовым классом для всех классов, представляющий поток ввода.

Основные методы:

Возвращает количество байт, которое может быть прочитано из потока без блокировки. Некоторые реализации InputStream возвращают полное количество байт в потоке, но не все. Не стоит использовать этот метод для определения размера буфера, который будет хранить все данные из потока.

Закрывает поток и освобождает все ресурсы.

Источник

Собеседование по 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. Какие существуют виды потоков ввода/вывода?

Разделяют два вида потоков ввода/вывода: байтовые и символьные.

java что такое inputstream и outputstream

Система ввода/вывода: 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. Что вы знаете о классах-надстройках?

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. Символы, записанные в поток, преобразовываются в байты.

Источник

Что такое InputStream & Output Stream? Почему и когда мы их используем?

Кто-нибудь объяснит мне, что InputStream и OutputStream есть?

Если бы вы могли также добавить фрагмент кода, который сопровождал бы ваше объяснение, это было бы здорово. Спасибо!

Цель InputStream и OutputStream состоит в том, чтобы абстрагировать различные способы ввода и вывода: независимо от того, является ли поток файлом, веб-страницей или экраном, значение не имеет. Все, что имеет значение, это то, что вы получаете информацию из потока (или отправляете информацию в этот поток).

InputStream используется для многих вещей, которые вы читаете.

OutputStream используется для многих вещей, которые вы пишете.

Вот пример кода. Предполагается, что InputStream instr и OutputStream osstr уже были созданы:

InputStream используется для чтения, OutputStream для записи. Они связаны как декораторы друг с другом, так что вы можете читать / записывать все типы данных из разных источников.

Например, вы можете записать примитивные данные в файл:

Чтобы прочитать письменное содержание:

Вы можете использовать другие типы потоков для улучшения чтения / записи. Например, вы можете ввести буфер для эффективности:

Вы можете написать другие данные, такие как объекты:

Вы можете читать из других источников:

Для большинства входных потоков также есть выходной поток. Вы можете определить свои собственные потоки для чтения / записи специальных вещей, и есть сложные потоки для чтения сложных вещей (например, есть потоки для чтения / записи в формате ZIP).

Программа использует входной поток для чтения данных из источника, по одному элементу за раз:

java что такое inputstream и outputstream

Программа использует выходной поток для записи данных в пункт назначения, по одному элементу за раз:

java что такое inputstream и outputstream

Пример кода из руководства по оракулу:

Взгляните на этот вопрос SE, чтобы узнать больше о продвинутых символьных потоках, которые являются обертками поверх байтовых потоков:

Источник

Пакет java.io

Система ввода/вывода. Потоки данных (stream)

В Java для описания работы по вводу/выводу используется специальное понятие поток данных ( stream ). Поток данных связан с некоторым источником или приемником данных, способным получать или предоставлять информацию. Соответственно, потоки делятся на входящие – читающие данные и выходящие – передающие (записывающие) данные. Введение концепции stream позволяет отделить основную логику программы, обменивающейся информацией с любыми устройствами одинаковым образом, от низкоуровневых операций с такими устройствами ввода/вывода.

java что такое inputstream и outputstream

Классы InputStream и OutputStream

Метод read() – это абстрактный метод, но именно с соблюдением всех указанных условий он должен быть реализован в классах-наследниках.

Точно так же, как InputStream – это базовый класс для потоков ввода, класс OutputStream – это базовый класс для потоков вывода.

Классы-реализации потоков данных

Классы ByteArrayInputStream и ByteArrayOutputStream

Если запустить такую программу, на экране отобразится следующее:

Классы FileInputStream и FileOutputStream

Результатом работы программы будет:

При работе с FileInputStream метод available() практически наверняка вернет длину файла, то есть число байт, сколько вообще из него можно считать. Но не стоит закладываться на это при написании программ, которые должны устойчиво работать на различных платформах,– метод available() возвращает число байт, которое может быть на данный момент считано без блокирования. Тот факт, что, скорее всего, это число и будет длиной файла, является всего лишь частным случаем работы на некоторых платформах.

В приведенном примере для наглядности закрытие потоков производилось сразу же после окончания их использования в основном блоке. Однако лучше закрывать потоки в finally блоке.

Такой подход гарантирует, что поток будет закрыт и будут освобождены все связанные с ним системные ресурсы.

PipedInputStream и PipedOutputStream

Использование связки PipedInputStream и PipedOutputStream показано в следующем примере:

StringBufferInputStream
SequenceInputStream

Источник

Потоки вывода, OutputStream

Стандартная библиотека Java имеет весьма развитые средства вывода данных. Все возможности вывода данных сосредоточены в пакете java.io.

Существуют две параллельные иерархии классов вывода : OutputStream и Writer. Класс Writer введен в последних версиях Java.

В данной статье рассматривается вопрос использования потоков для вывода данных в файл. Иерархии выходных OutputStream потоков представлена на следующем рисунке.

java что такое inputstream и outputstream

Поток Stream— это абстрактное значение источника или приёмника данных, которые способны обрабатывать информацию. Есть два типа потоков: байтовые и символьные. В некоторых ситуациях символьные потоки более эффективны, чем байтовые. Классы, производные от классов OutputStream или Writer, имеют методы с именами write() для записи одиночных байтов или массива байтов (отвечают за вывод данных).

Выходной поток OutputStream

Методы класса OutputStream :

Класс ByteArrayOutputStream

Класс ByteArrayOutputStream представляет поток вывода, использующий массив байтов в качестве места вывода. Чтобы создать объект данного класса, можно использовать один из его конструкторов :

Первый конструктор создает массив данных для хранения байтов длиной в 32 байта, а второй конструктор создает массив длиной size.

Примеры использования класса ByteArrayOutputStream :

В классе ByteArrayOutputStream метод write записывает в поток некоторые данные (массив байтов). Этот массив байтов записывается в объекте ByteArrayOutputStream в защищенное поле buf, которое представляет также массив байтов (protected byte[] buf). Так как метод write может вызвать исключение, то вызов этого метода помещается в блок try..catch.

Используя методы toString() и toByteArray(), можно получить массив байтов buf в виде текста или непосредственно в виде массива байт.

С помощью метода writeTo можно перенаправить массив байт в другой поток. Данный метод в качестве параметра принимает объект OutputStream, в который производится запись массива байт :

Для ByteArrayOutputStream не надо явным образом закрывать поток с помощью метода close.

Класс FileOutputStream

Класс FileOutputStream создаёт объект класса OutputStream, который можно использовать для записи байтов в файл. Это основной класс для работы с файлами. Создание нового объекта не зависит от того, существует ли заданный файл или нет. Если файл отсутствует, то будет создан новый файл. В случае попытки открытия файла, доступного только для чтения, будет вызвано исключение.

FileOutputStream имеет следующий конструкторы:

Смысл конструкторов последнего понятен из их описания. Но имеется несколько нюансов :

Какой-либо дополнительной функциональности по сравнению с базовым классом FileOutputStream не добавляет.

Класс BufferedOutputStream

Класс BufferedOutputStream создает буфер для потоков вывода. Этот буфер накапливает выводимые байты без постоянного обращения к устройству. И когда буфер заполнен, производится запись данных.

BufferedOutputStream не добавляет много новой функциональности, он просто оптимизирует действие потока выводаи его следует использовать для организации более эффективного буферизованного вывода в поток.

Класс DataOutputStream

Класс DataOutputStream позволяет писать данные в поток через интерфейс DataOutput, который определяет методы, преобразующие элементарные значения в форму последовательности байтов. Такие потоки облегчают сохранение в файле двоичных данных.

Для записи каждого из примитивных типов предназначен свой метод класса DataOutputStream:

Класс PrintStream

Но PrintStream можно использовать для записи информации в поток вывода. Например, запишем информацию в файл:

В данном примере используется конструктор PrintStream, который в качестве параметра принимает поток вывода FileOutputStream. Можно было бы также использовать конструктор с указанием названия файла для записи: PrintStream (String filename).

Для вывода информации в выходной поток PrintStream использует следующие методы:

Следующий код показывает возможности использования форматированного вывода класса PrintStream :

Класс ObjectOutputStream

Класс ObjectOutputStream используется для сериализации объектов в поток. Сериализация представляет процесс записи состояния объекта в поток, соответственно процесс извлечения или восстановления состояния объекта из потока называется десериализацией. Сериализация очень удобна, когда идет работа со сложными объектами.

Для создания объекта ObjectOutputStream необходимо в конструктор передать поток, в который будет производится запись объектов.

Для записи данных ObjectOutputStream использует ряд методов, среди которых можно выделить следующие:

МетодОписание
void close()закрывает поток
void flush()сбрасывает содержимое буфера в выходной поток и очищает его
void write(byte[] buf)записывает в поток массив байтов
void write(int val)записывает в поток один младший байт из val
void writeBoolean(boolean val)записывает в поток значение boolean
void writeByte(int val)записывает в поток один младший байт из val
void writeChar(int val)записывает в поток значение типа char, представленное целочисленным значением
void writeDouble(double val)записывает в поток значение типа double
void writeFloat(float val)записывает в поток значение типа float
void writeInt(int val)записывает целочисленное значение
void writeLong(long val)записывает значение типа long
void writeShort(int val)записывает значение типа short
void writeUTF(String str)записывает в поток строку в кодировке UTF-8
void writeObject(Object obj)записывает в поток отдельный объект

Представленные методы охватывают весь спектр данных, которые можно сериализовать.

Пример использования класса ObjectOutputStream :

Необходимо принимать во внимание, что сериализовать можно только те объекты, которые реализуют интерфейс Serializable.

Класс PipedOutputStream

Пакет java.io содержит класс PipedOutputStream, который может быть подключен к PipedInputStream, используемый для установления связи между двумя каналами. Данные в PipedOutputStream передаются в потоке Thread, который отправляет их в подключенный PipedInputStream, где данные также читаются, но в другом потоке.

То есть, класс PipedOutputStream предназначен для передачи информации между программами через каналы (pipes).

Наиболее часто используемые методы класса PipedOutputStream :

Все методы класса могут вызвать исключение IOException.

Пример использования класса PipedOutputStream :

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *