Что такое поток ввода вывода

Потоки ввода-вывода. Работа с файлами

Потоки ввода-вывода

Что такое поток ввода вывода. Смотреть фото Что такое поток ввода вывода. Смотреть картинку Что такое поток ввода вывода. Картинка про Что такое поток ввода вывода. Фото Что такое поток ввода вывода

Поток связан с реальным физическим устройством с помощью системы ввода-вывода 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 соответственно, предназначенными для работы с текстовыми файлами.

Теперь рассмотрим конкретные классы потоков.

Источник

Стандартные потоки ввода/вывода

Материал из Xgu.ru

Стандартные потоки ввода и вывода в UNIX/Linux наряду с файлами являются одним из наиболее распространённых средств для обмена информацией процессов с внешним миром, а перенаправления >, >> и |, одной из самых популярных конструкций командного интерпретатора.

На этой странице рассматриваются как базовые вопросы использования потоков ввода/вывода, так и тонкости и хитрости, например, почему не работает echo text | read ver и многие другие.

Содержание

[править] Потоки и файлы

Процесс взаимодействия с пользователем выполняется в терминах записи и чтения в файл. То есть вывод на экран представляется как запись в файл, а ввод — как чтение файла. Файл, из которого осуществляется чтение, называется стандартным потоком ввода, а в который осуществляется запись — стандартным потоком вывода.

Что такое поток ввода вывода. Смотреть фото Что такое поток ввода вывода. Смотреть картинку Что такое поток ввода вывода. Картинка про Что такое поток ввода вывода. Фото Что такое поток ввода вывода

Стандартные потоки — воображаемые файлы, позволяющие осуществлять взаимодействие с пользователем как чтение и запись в файл. Кроме потоков ввода и вывода, существует еще и стандартный поток ошибок, на который выводятся все сообщения об ошибках и те информативные сообщения о ходе работы программы, которые не могут быть выведены в стандартный поток вывода.

Стандартные потоки привязаны к файловым дескрипторам с номерами 0, 1 и 2.

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

Использовать файл как источник данных для стандартного потока ввода. > файл Направить стандартный поток вывода в файл. Если файл не существует, он будет создан; если существует — перезаписан сверху. 2> файл Направить стандартный поток ошибок в файл. Если файл не существует, он будет создан; если существует — перезаписан сверху. >>файл Направить стандартный поток вывода в файл. Если файл не существует, он будет создан; если существует — данные будут дописаны к нему в конец. 2>>файл Направить стандартный поток ошибок в файл. Если файл не существует, он будет создан; если существует — данные будут дописаны к нему в конец. &>файл или >&файл Направить стандартный поток вывода и стандартный поток ошибок в файл. Другая форма записи: >файл 2>&1. >&- Закрыть поток вывода перед вызовом команды (спасибо [1]); 2>&- Закрыть поток ошибок перед вызовом команды (спасибо [2]); cat

Весь текст между блоками EOF (в общем случае вместо EOF можно использовать любое слово) будет выведен на экран. Важно: перед последним EOF не должно быть пробелов! (heredoc синтаксис).

EOF Аналогично, но только для одной строки (для bash версии 3 и выше)

Пример. Эта команда объединяет три файла: header, body и footer в один файл letter:

Команда cat по очереди выводит содержимое файлов, перечисленных в качестве параметров на стандартный поток вывода. Стандартный поток вывода перенаправлен в файл letter.

Здесь используется сразу перенаправление стандартного потока ввода и стандартного потока вывода:

Программа sort сортирует данные, поступившие в стандартный поток ввода, и выводит их на стандартный поток вывода. Стандартный поток ввода подключен к файлу unsortedlines, а выход записывается в sortedlines.

Здесь перенаправлены потоки вывода и ошибок:

Программа find ищет в каталоге /home файлы с суффиксом .rpm. Список найденных файлов записывается в файл rpmlist. Все сообщения об ошибках удаляются. Удаление достигается при помощи перенаправления потока ошибок на устройство /dev/null — специальный файл, означающий ничто. Данные, отправленные туда, безвозвратно исчезают. Если же прочитать содержимое этого файла, он окажется пуст.

Для того чтобы лучше понять, что потоки работают как файлы, рассмотрим такой пример:

Программа cat запускается для записи данных в файл /tmp/fff. Он запускается в фоне (&), и получает номер работы 1 ([1]). Процесс этой программы имеет номер 28378.

Информация о процессе 28738 находится в каталоге /proc/28738 специальной псевдофайловой системы /proc. В частности, в подкаталоге /proc/28738/fd/ находится список файловых дескрипторов для открытых процессом файлов.

Здесь видно, что стандартный поток ввода (0), и стандартный поток ошибок (2) процесса подключены на терминал, а вот стандартный поток вывода (1) перенаправлен в файл.

Завершить работу программы cat можно командой kill %1.

Командный интерпретатор — это тоже процесс. И у него есть стандартные потоки ввода и вывода. Если интерпретатор работает в интерактивном режиме, то они подключены на консоль (вывода на экран; чтение с клавиатуры). Можно обратиться напрямую к этим потокам изнутри интерпретатора:

Например, здесь видно, что потоки ссылаются в конечном итоге на файл-устройство терминала, с которым работает интерпретатор:

[править] Каналы

Стандартные потоки можно перенаправлять не только в файлы, но и на вход других программ. Если поток вывода одной программы соединить с потоком ввода другой программы, получится конструкция, называемая каналом, конвейером или пайпом (от англ. pipe, труба).

Что такое поток ввода вывода. Смотреть фото Что такое поток ввода вывода. Смотреть картинку Что такое поток ввода вывода. Картинка про Что такое поток ввода вывода. Фото Что такое поток ввода вывода

В bash канал выглядит как последовательность команд, отделенных друг от друга символом |:

Стандартный поток вывода команды1 подключается к стандартному потоку ввода команды2, стандартный поток вывода команды2 в свою очередь подключается к потоку ввода команды3 и т.д.

В UNIX/Linux существует целый класс команд, предназначенных для преобразования потоков данных в каналах. Такие программы известны как фильтры. Программа-фильтр читает данные, поступающие со стандартного потока ввода (на вход), преобразовывает их требуемым образом и выводит на стандартный поток вывода (на выход). Существует множество хорошо известных фильтров, призванных решать определенные задачи, и являющихся незаменимым инструментом в руках пользователя ОС.

Каналы в ОС Linux являются одной из наиболее часто применяемых конструкций, а фильтры — наиболее часто применяемых программ. Большинство повседневных задач в Linux легко решаются при помощи конструкций построенных на основе нескольких фильтров.

Программы, образующие канал, выполняются параллельно как независимые процессы.

Можно создавать ответвление в каналах. Команда tee позволяет сохранять данные, передающиеся в канале:

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

Рассмотренный ниже пример: сортируется файл unsortedlines и результат записывается в sortedlines.

Команда выполняет те же действия, но запись является более наглядной.

Вот пример посложнее. Вывести название и размер пользовательского каталога, занимающее наибольшее место на диске.

Программа du, при вызове ее с ключом -s, сообщает суммарный объем каждого каталога или файла, перечисленного в ее параметрах.

Ключ -n команды sort означает, что сортировка должна быть арифметической, т.е. строки должны рассматриваться как числа, а не как последовательности символов (Например, 12>5 в то время как строка ’12’ [править] Программы фильтры

В UNIX/Linux существует целый класс команд, которые принимают данные со стандартного потока ввода, каким-то образом обрабатывают их, и выдают результат на стандартный поток вывода. Такие программы называются программами-фильтрами.

Как правило, все эти программы работают как фильтры, если у них нет аргументов (опции могут быть), но как только им в качестве аргумента передаётся файл, они считывают данные из этого файла, а не со стандартного потока ввода (существуют и исключения, например, программа tr, которая обрабатывает данные поступающие исключительно через стандартный поток ввода).

Что такое поток ввода вывода. Смотреть фото Что такое поток ввода вывода. Смотреть картинку Что такое поток ввода вывода. Картинка про Что такое поток ввода вывода. Фото Что такое поток ввода вывода

Что такое поток ввода вывода. Смотреть фото Что такое поток ввода вывода. Смотреть картинку Что такое поток ввода вывода. Картинка про Что такое поток ввода вывода. Фото Что такое поток ввода вывода

[править] Переменные командного интерпретатора и потоки

Для того чтобы вывести содержимое переменной командного интерпретатора на стандартный поток вывода, используется команда echo:

На стандартный поток ошибок данные можно передать с помощью перенаправления:

Содержимое переменной (или любой другой текст) поступят не на стандартный поток вывода, а на стандартный поток ошибок.

Считать данные со стандартного потока ввода внутрь одной или нескольких переменных можно при помощи команды read:

Строка из стандартного потока ввода считается внутрь переменной VAR.

Если указать несколько переменных, то в первую попадёт первое слово; во вторую — второе слово; в последнюю — всё остальное.

Если прочитать данные со стандартного потока ввода не удалось, то команда read возвращает код завершения отличный от нуля. Это позволяет использовать read, например, в такой конструкции:

В этом примере read считывает строки из файла users, и для каждой прочитанной строки вызывается команда useradd, которая добавляет пользователя в системе. В результате: создаются учётные записи пользователей, имена которых перечислены в файле users.

Переменная user после выхода из цикла остаётся в том же виде, в каком она была до входа в цикл (а не содержит последнее значение файла, как можно было бы предположить). Это связано с тем, что для обработки while, на вход которому направлен канал, порождается дочерний интерпретатор, и модификация переменной происходит внутри него.

[править] Именованные каналы

Безымянный канал можно построить только между процессами, которые порождены от одного процесса (и на практике они должны быть порождены одновременно, а не последовательно, хотя теоретически это не обязательно). Если же процессы имеют разных родителей, то между ними обычный, безымянный канал построить не получится.

Что такое поток ввода вывода. Смотреть фото Что такое поток ввода вывода. Смотреть картинку Что такое поток ввода вывода. Картинка про Что такое поток ввода вывода. Фото Что такое поток ввода вывода

Например, в данном случае d и e, и f и g легко могут быть соединены при помощи канала, но e и f соединить с помощью канала не получится.

Для решения этой задачи используются именованные каналы fifo (first in, first out). Они во всём повторяют обычные каналы (pipe), только имеют привязку к файловой системе. Создать именованный канал можно командой mkfifo:

Созданный канал можно использовать для соединения процессов между собой. Например, эти перенаправления будут работать одинаково:

(здесь f и g — процессы из вышеуказанной иерархии процессов). Процессы f и g имеют общего предка. А вот для процессов e и g, не связанных между собой, обычный канал использовать не получится, только именованный:

[править] Потоки ввода/вывода и терминал

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

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

Например, возможности прокручивать историю команд у него теперь нет. Возможности по редактированию теперь тоже сильно урезаны. Фактически, редактирование команды теперь выполняется уже с помощью программы cat, которая держит терминал, а интерпретатору поступают уже полностью введённые команды.

Проверить, подключен ли наш стандартный поток к терминалу, или он перенаправлен в файл, можно при помощи test, ключ -t:

[править] Подстановка процесса

Есть хитрый трюк, который в чистом виде перенаправлением потока ввода/вывода не является, но имеет к нему отношение — подстановка процесса. Результат выполнения процесса можно представить в виде воображаемого файла и передать его другому процессу.

При таком вызове процессу команда1 передаётся файл (созданный налету канал или файл /dev/fd/. ), в котором находятся данные, которые выводит команда2.

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

Получается, что в первом файле присутствует слово, которое отсутствует во втором (слово b).

[править] Перенаправление вывода скрипта

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

[править] Поменять местами стандартный поток вывода и стандартный поток ошибок

[править] Просмотр прогресса и скорости обработки данных в потоке

Если пропустить данные, передающиеся в канале, через программу pv, то будет видна скорость обработки, время в течение которого работает канал и, если известно сколько данных должно быть обработано, приблизительное время окончания выполнения.

Источник

Файловый и потоковый ввод-вывод

Файл — это упорядоченная и именованная последовательность байтов, имеющая постоянное хранилище. При работе с файлами используются пути к каталогам, запоминающие устройства, а также имена файлов и каталогов. В отличие от файла, поток — это последовательность байтов, которую можно использовать для записи или чтения из вспомогательного запоминающего устройства, являющегося одним из устройств хранения информации (например, дисков или памяти). Есть несколько видов запоминающих устройств, отличных от дисков, и существует несколько видов потоков, помимо файловых потоков, например сетевые потоки, потоки памяти и потоки каналов.

Файлы и каталоги

Типы в пространстве имен System.IO можно использовать для взаимодействия с файлами и каталогами. Например, можно получать и задавать свойства файлов и каталогов, а также извлекать коллекции файлов и каталогов на основе критерия поиска.

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

File предоставляет статические методы для создания, копирования, удаления, перемещения и открытия файлов, а также помогает создать объект FileStream.

FileInfo предоставляет методы экземпляра для создания, копирования, удаления, перемещения и открытия файлов, а также помогает создать объект FileStream.

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

DirectoryInfo предоставляет методы экземпляра для создания, перемещения и перечисления в каталогах и подкаталогах.

Path предоставляет методы и свойства для обработки строк каталогов межплатформенным способом.

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

Помимо использования этих классов, пользователи Visual Basic могут использовать методы и свойства, предоставляемые классом Microsoft.VisualBasic.FileIO.FileSystem для файлового ввода-вывода.

Потоки

Абстрактный базовый класс Stream поддерживает чтение и запись байтов. Все классы, представляющие потоки, являются производными от класса Stream. Класс Stream и его производные классы обеспечивают общий способ просмотра источников данных и хранилищ объектов, а также изолируют программиста от специфических особенностей операционной системы и базовых устройств.

Потоки включают три основные операции:

Чтение — перенос информации из потока в структуру данных, такую как массив байтов.

Запись — перенос данных в поток из источника данных.

Поиск — определение и изменение текущей позиции внутри потока.

В зависимости от базового источника или хранилища данных поток может поддерживать лишь некоторые из этих возможностей. Например, класс PipeStream не поддерживает поиск. Свойства CanRead, CanWrite и CanSeek потока определяют операции, поддерживаемые потоком.

Ниже перечислены некоторые часто используемые классы потока:

FileStream — для чтения и записи в файл.

IsolatedStorageFileStream — для чтения и записи в файл в изолированном хранилище.

MemoryStream — для чтения и записи в память в качестве резервного хранилища.

BufferedStream — для повышения быстродействия операций чтения и записи.

NetworkStream — для чтения и записи на сетевые сокеты.

PipeStream — для чтения и записи в анонимные и именованные каналы.

CryptoStream — для связи потоков данных с криптографическими преобразованиями.

Пример асинхронной работы с потоками см. в разделе Асинхронный файловый ввод-вывод.

Средства чтения и записи

Ниже перечислены некоторые часто используемые классы для чтения и записи:

BinaryReader и BinaryWriter — для чтения и записи простых типов данных, таких как двоичные значения.

StreamReader и StreamWriter — для чтения и записи символов с использованием закодированного значения для преобразования символов в байты или из байтов.

StringReader и StringWriter — для чтения и записи символов в строки или из строк.

TextReader и TextWriter используются в качестве абстрактных базовых классов для других средств чтения и записи, которые считывают и записывают символы и строки, а не двоичные данные.

Асинхронные операции ввода-вывода

Чтение и запись больших объемов данных может быть ресурсоемкой. Эти задачи необходимо выполнять асинхронно, если приложение должно продолжать отвечать на запросы пользователя. В случае синхронных операций ввода-вывода поток пользовательского интерфейса будет заблокирован до тех пор, пока ресурсоемкая операция не завершится. При разработке приложений Microsoft Store для Windows 8.x используйте асинхронные операции ввода-вывода, чтобы не создавалось впечатления, что приложение прекратило свою работу.

Дополнительные сведения см. в разделе Асинхронный файловый ввод-вывод.

Сжатие

Сжатием называется процесс сокращения размера сохраняемого файла. Распаковка — это процесс извлечения содержимого сжатого файла, что приводит его в формат, пригодный для использования. Пространство имен System.IO.Compression содержит типы для сжатия и распаковки файлов и потоков.

При сжатии и распаковке файлов и потоков часто используются следующие классы:

ZipArchive — для создания и восстановления содержимого ZIP-архива.

ZipArchiveEntry — для представления сжатого файла.

ZipFile — для создания, извлечения и открытия сжатого пакета.

ZipFileExtensions — для создания и извлечения содержимого из сжатого пакета.

DeflateStream — для сжатия и распаковки потоков с помощью алгоритма Deflate.

GZipStream — для сжатия и распаковки потоков в формате gzip.

См. практическое руководство по Сжатие и извлечение файлов.

Изолированное хранилище

Изолированное хранилище — это механизм хранения данных, обеспечивающий изоляцию и безопасность путем определения стандартизованных способов сопоставления кода с хранимыми данными. Хранилище предоставляет виртуальную файловую систему, изолированную по пользователю, сборке и (необязательно) домену. Изолированное хранилище особенно полезно в том случае, когда приложение не имеет разрешения на доступ к файлам пользователя. Можно сохранить параметры или файлы для приложения таким способом, который контролируется политикой безопасности компьютера.

Изолированное хранилище недоступно для приложений Microsoft Store для Windows 8.x. Вместо этого используйте классы данных приложения в пространстве имен Windows.Storage. Дополнительные сведения см. в разделе Данные приложения.

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

IsolatedStorage предоставляет базовый класс для реализации изолированного хранилища.

IsolatedStorageFile предоставляет область изолированного хранилища, в которой содержатся файлы и каталоги.

IsolatedStorageFileStream представляет файл в изолированном хранилище.

Операции ввода-вывода в приложениях Microsoft Store

Следует отметить некоторые важные различия в использовании операций ввода-вывода в приложениях Microsoft Store для Windows 8.x:

Изолированное хранилище недоступно; вместо этого используйте данные приложения.

Используйте асинхронные методы, такие как ReadAsync и WriteAsync, чтобы предотвратить блокировку потока пользовательского интерфейса.

Типы сжатия на основе пути ZipFile и ZipFileExtensions недоступны. Вместо этого используйте типы в пространстве имен Windows.Storage.Compression.

Дополнительные сведения об операциях ввода-вывода в приложении Microsoft Store для Windows 8.x: Краткое руководство. Чтение и запись файлов.

Ввод-вывод и безопасность

При использовании классов в пространстве имен System.IO необходимо выполнить требования безопасности операционной системы, такие как списки управления доступом для контроля доступа к файлам и каталогам. Это требование дополняет остальные требования FileIOPermission. Списками управления доступом можно управлять программно. Дополнительные сведения см. в разделе Практическое руководство. Добавление или удаление записей списка управления доступом.

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

См. также

Распространенные задачи ввода-вывода
Содержит список задач ввода-вывода, связанных с файлами, каталогами и потоками, а также ссылки на соответствующее содержимое и примеры для каждой задачи.

Асинхронный файловый ввод-вывод
Описывает преимущества и основные операции асинхронного ввода и вывода.

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

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

Источник

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

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