на каком паттерне основана иерархия потоков ввода вывода java
Потоки ввода-вывода. Работа с файлами
Потоки ввода-вывода
Поток связан с реальным физическим устройством с помощью системы ввода-вывода Java. У нас может быть определен поток, который связан с файлом и через который мы можем вести чтение или запись файла. Это также может быть поток, связанный с сетевым сокетом, с помощью которого можно получить или отправить данные в сети. Все эти задачи: чтение и запись различных файлов, обмен информацией по сети, ввод-ввывод в консоли мы будем решать в Java с помощью потоков.
В основе всех классов, управляющих потоками байтов, находятся два абстрактных класса: InputStream (представляющий потоки ввода) и OutputStream (представляющий потоки вывода)
Но поскольку работать с байтами не очень удобно, то для работы с потоками символов были добавлены абстрактные классы Reader (для чтения потоков символов) и Writer (для записи потоков символов).
Все остальные классы, работающие с потоками, являются наследниками этих абстрактных классов. Основные классы потоков:
Потоки байтов
Класс InputStream
Класс InputStream является базовым для всех классов, управляющих байтовыми потоками ввода. Рассмотрим его основные методы:
int available() : возвращает количество байтов, доступных для чтения в потоке
void close() : закрывает поток
long skip(long number) : пропускает в потоке при чтении некоторое количество байт, которое равно number
Класс OutputStream
Класс OutputStream является базовым классом для всех классов, которые работают с бинарными потоками записи. Свою функциональность он реализует через следующие методы:
void close() : закрывает поток
void flush() : очищает буфер вывода, записывая все его содержимое
void write(int b) : записывает в выходной поток один байт, который представлен целочисленным параметром b
void write(byte[] buffer) : записывает в выходной поток массив байтов buffer.
Абстрактные классы Reader и Writer
Абстрактный класс Reader предоставляет функционал для чтения текстовой информации. Рассмотрим его основные методы:
absract void close() : закрывает поток ввода
absract int read(char[] buffer, int offset, int count) : считывает в массив buffer, начиная со смещения offset, из потока символы, количество которых равно count
long skip(long count) : пропускает количество символов, равное count. Возвращает число успешно пропущенных символов
Класс Writer определяет функционал для всех символьных потоков вывода. Его основные методы:
Writer append(char c) : добавляет в конец выходного потока символ c. Возвращает объект Writer
Writer append(CharSequence chars) : добавляет в конец выходного потока набор символов chars. Возвращает объект Writer
abstract void close() : закрывает поток
abstract void flush() : очищает буферы потока
void write(int c) : записывает в поток один символ, который имеет целочисленное представление
void write(char[] buffer) : записывает в поток массив символов
absract void write(char[] buffer, int off, int len) : записывает в поток только несколько символов из массива buffer. Причем количество символов равно len, а отбор символов из массива начинается с индекса off
void write(String str) : записывает в поток строку
void write(String str, int off, int len) : записывает в поток из строки некоторое количество символов, которое равно len, причем отбор символов из строки начинается с индекса off
Функционал, описанный классами Reader и Writer, наследуется непосредственно классами символьных потоков, в частности классами FileReader и FileWriter соответственно, предназначенными для работы с текстовыми файлами.
Теперь рассмотрим конкретные классы потоков.
Декорирование классов java.io
Трудно переоценить значимость пакета java.io: он поддерживает систему ввода-вывода в Java. В качестве источника ввода или места вывода могут выступать файл, сетевое соединение, консоль. Все устройства описываются единой абстракцией – потоком (stream).
В пакете java.io множество классов и интерфейсов, предназначенных для работы с байтовыми и символьными потоками, сериализацией объектов. Их разнообразие по началу может смущать, а последовательность использования не выглядит очевидной. Помочь с осмыслением может Декоратор.
Паттерн Декоратор динамически наделяет объект новыми возможностями и является гибкой альтернативой субклассированию в области расширения функциональности.
Теперь взглянем на часть иерархии классов в java.io.
На схеме InputStream – абстрактный компонент. Конкретные компоненты: FileInputStream, StringBufferInputSteam, ByteArrayInputStream, ObjectInputStream и др.
Абстрактный декоратор – FilterInputStream, его потомки – конкретные декораторы:
Иногда бывает полезным создать свою систему декораторов. Предположим, необходимо организовать поиск файлов в каталоге.
Используем следующие фильтры:
В примере ниже осуществляется поиск всех текстовых файлов, в имени которых встречаются “io” и “java”, с длинной имени файла не меньше 4:
Понятно, что данные классы позволяют накладывать на искомые файлы произвольное число условий в произвольной последовательности, что возвращает нас к неограниченным возможностям декорирования.
Идея и определение паттерна из книги Эрика Фримен и Элизабет Фримен«Паттерны проектирования».
Если Вам понравилась статья, проголосуйте за нее
Голосов: 10 Голосовать
Собеседование по 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. Что вы знаете о классах-надстройках?
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. Символы, записанные в поток, преобразовываются в байты.
Русские Блоги
Java: иерархия пакетов java.io потока ввода и вывода
1. Что такое ввод-вывод
JavaОперация ввода-вывода в основном относится к использованию Java для операций ввода и вывода. Все механизмы ввода-вывода Java основаны на потоках данных для ввода и вывода. Эти потоки данных представляют собой последовательность потоков символьных или байтовых данных. Поток ввода-вывода Java предоставляет стандартный метод чтения и записи данных. Любой объект, представляющий источник данных в Java, предоставит метод для чтения и записи своих данных в потоке данных. Чтобы
Преимущество потокового ввода-вывода в том, что он прост и удобен в использовании, но недостатком является его низкая эффективность. Блочный ввод-вывод очень эффективен, но программирование сложнее. Чтобы
Java Модель ввода-вывода:
Модель ввода-вывода Java выполнена превосходно. Она использует режим декоратора для разделения потоков по функциям. Вы можете динамически собирать эти потоки для получения нужных функций. Например, если вам нужен поток ввода буферизованного файла, вы должны объединить FileInputStream и BufferedInputStream.
2. Основная концепция потока данных
В библиотеке классов Java содержимое части ввода-вывода очень велико, поскольку оно охватывает широкий спектр полей:
Стандартный ввод и вывод, файловые операции, потоки данных в сети, потоки строк, потоки объектов, потоки файлов zip и т. Д.Абстракция ввода и вывода в java называется потоком., Как водопровод, соединяющий две емкости. Чтение данных из внешней памяти в память называется потоком ввода, а запись данных из памяти во внешнюю память называется потоком вывода.
Кратко изложены следующие основные концепции:
1) Поток данных:
Группа упорядоченных последовательностей данных с начальным и конечным байтами. Включая поток ввода и поток вывода. [Отделено от потока данных памяти]
2) Входной поток(Input Stream):
3) Выходной поток:
Input Stream не заботится о том, с какого типа устройства исходит источник данных (клавиатура, файл, сеть)
Output Stream не заботится о том, какое устройство предназначено для данных (клавиатура, файл, сеть
3 Классификация потока данных:
Ввод-вывод Java в основном включает следующие уровни, состоящие из трех частей:
1. Потоковая часть:Основная часть IO;
2. Непотоковая часть:В основном он содержит некоторые вспомогательные классы потоковой передачи, такие как: класс File, класс RandomAccessFile и класс FileDescriptor;
3. Прочие категории:Связанные с безопасностью классы в части чтения файла, такие как класс SerializablePermission, и локальныйОперационная системаСвязанные классы файловой системы, такие как: класс FileSystem, класс Win32FileSystem и класс WinNTFileSystem.
Основные категории:
1. Файл (характеристики файлов и управление ими): описательная информация для файлов или каталогов, такая как создание новых каталогов, изменение имен файлов, удаление файлов, определение пути к файлам и т. Д.
2. InputStream (операция двоичного формата): абстрактный класс, побайтовая операция ввода, является родительским классом для всех входных потоков. Определяет общие характеристики всех входных потоков.
3. OutputStream (операция двоичного формата): абстрактный класс. Побайтовые операции вывода. Это родительский класс всех выходных потоков. Определяет общие характеристики всех выходных потоков.
Символы в Java соответствуют стандарту Unicode, а длина символа составляет 16 бит, то есть символ представлен двумя байтами. По этой причине в JAVA был введен поток для обработки символов.
4. Читатель (операции с форматами файлов): абстрактный тип, символьные операции ввода.
5. Writer (операция формата файла): абстрактный класс, символьная операция вывода.
6. RandomAccessFile (случайная файловая операция): имеет богатые функции,Операции доступа (ввода и вывода) могут выполняться из любой позиции файла.。
Архитектура потока ввода-вывода в Java показана на рисунке:
В пакете java.io языка Java класс File предоставляет операции и методы управления, описывающие файлы и каталоги. Но класс File не является подклассом InputStream, OutputStream или Reader, Writer, потому что он не отвечает за ввод и вывод данных, а специально используется для управления дисковыми файлами и каталогами.
Функция: класс File в основном используется для именования файлов, атрибутов файлов запросов и обработки каталогов файлов.
Класс File предоставляет в общей сложности три различных конструктора для гибкого получения информации об именах файлов и каталогов в различных формах параметров. Конструктор:
1)File (String pathname)
После создания объекта File, соответствующего определенному файлу или каталогу на диске, атрибуты файла или каталога можно получить, вызвав его методы. …
1) public boolean exists () Определите, существует ли файл или каталог
2) public boolean isFile () Определяет, является ли это файлом или каталогом
3) public boolean isDirectory () Определяет, является ли это файлом или каталогом
4) public String getName () возвращает имя файла или имя каталога
5) public String getPath () возвращает путь к файлу или каталогу.
6) public long length () Получить длину файла
7) public String [] list () Сохранить все имена файлов в каталоге в массиве строк и вернуться. Чтобы
Класс File также определяет некоторые методы для управления файлами или каталогами и управления ими. Обычно используемые методы:
1) public boolean renameTo (File newFile); Переименовать файл
2) public void delete (); Удалить файлы
3) public boolean mkdir (); Создать каталог
пример:
Описание: Методы класса File:
(1) exists()контрольная работаНаличие на диске указанного файла или каталога
(2) mkdir () создает каталог, указанный файловым объектом (одноуровневый каталог)
(3) createNewFile () создает файл, указанный файловым объектом
(4) list () возвращает все строки имен файлов в каталоге
6. Библиотека классов Java.IO Stream
1. Четыре основных класса io stream
Пакет java.io содержит все классы, необходимые для потокового ввода-вывода. В пакете java.io есть четыре основных класса: InputStream, OutputStream и классы Reader и Writer, которые имеют дело с потоками байтов и потоками символов соответственно:
Ввод / вывод для основного потока данных
BestProg
Система ввода/вывода Java. Потоки. Байтовые потоки. Символьные потоки. Стандартные потоки
Содержание
Поиск на других ресурсах:
1. Общие понятия системы ввода/вывода Java. Поток. Определение потока
В языке программирования Java ввод/вывод информации базируется на понятии потока. Поток – это абстрактное понятие, которое символизирует источник или приемник данных, который может передавать или получать некоторую информацию. Любой поток скрывает операции над данными, которые выполняются на низших уровнях непосредственно в устройствах ввода/вывода.
Соответственно назначению потоков, классифицируются и классы в языке Java. Одни классы реализуют операции ввода, другие реализуют операции вывода. Чтобы использовать классы потоков ввода/вывода нужно импортировать пакет java.io
Объекты классов Java, которые используются для ввода/вывода, для обеспечения необходимой функциональности наслаиваются друг на друга. Такая модель взаимодействия объектов поддерживается в паттерне «Декоратор». В этом паттерне при создании потока нужно использовать несколько объектов.
2. Виды потоков в Java
В языке Java различают два вида потоков:
Классы, которые реализуют байтовые потоки ввода унаследованы от абстрактного класса InputStream :
Классы, которые реализуют байтовые потоки вывода унаследованы от абстрактного класса OutputStream :
4. Символьные потоки ввода/вывода. Обзор классов символьных потоков
Классы, которые предназначены для описания символьных потоков делятся на два вида:
Классы потоков ввода следующие:
Классы потоков вывода следующие: