Основы ввода-вывода в Java

Светлана Комарова

Светлана Комарова

Автор статьи. Системный администратор, Oracle DBA. Информационные технологии, интернет, телеком. Подробнее.

Ввод-вывод в Java - основыБольшинство реальных прикладных программ На java не являются текстовыми консольными программами, а содержат графический пользовательский интер­фейс (ГПИ), построенный на основе библиотек AWT, Swing или JavaFX для взаи­модействия с пользователем, или же они являются веб-приложениями. Текстовые консольные программы отлично подходят в качестве учебных примеров, но они имеют весьма незначительное практическое применение. К тому же поддержка консольного ввода-вывода в java ограничена и не очень удобна в употреблении — даже в простейших программах. Таким образом, текстовый консольный ввод-вывод не имеет большого практического значения для программирования на java.


Оглавление статьи[Показать]


Несмотря на все сказанное выше, в java предоставляется сильная и универсаль­ная поддержка файлового и сетевого ввода-вывода. Система ввода-вывода в Java целостна и последовательна. Если усвоить ее основы, то овладеть всем остальным будет очень просто. 

 

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

В программах На java создаются потоки ввода-вывода. Поток ввода-вывода — это абстракция, которая поставляет или потребляет информацию. Поток ввода-вывода связан с физическим устройством через систему ввода-вывода в java. Все потоки ввода-вывода ведут себя одинаково, несмотря на отличия в конкретных физических устройствах, с которыми они связаны. Таким образом, одни и те же классы и ме­тоды ввода-вывода применимы к разнотипным устройствам. Это означает, что аб­стракция потока ввода может охватывать разные типы ввода: из файла на диске, клавиатуры или сетевого соединения. Аналогично поток вывода может обращаться к консоли, файлу на диске или сетевому соединению. Потоки ввода-вывода предо­ставляют ясный способ организации ввода-вывода, избавляя от необходимости раз­бираться в отличиях, например, клавиатуры от сети. В языке Java потоки ввода-вы­вода реализуются в пределах иерархии классов, определенных в пакете java.io.

На заметку! Помимо потокового ввода-вывода, определенного в пакете java.io, в Java предо­ставляется также буферный и канальный ввод-вывод, определенный в пакете java.nio и его подчиненных пакетах. 

 

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

ВJava определяются два вида потоков ввода-вывода: байтов и символов. Потоки ввода-вывода байтов предоставляют удобные средства для управления вводом и вы­водом отдельных байтов. Эти потоки используются, например, при чтении и за­писи двоичных данных. Потоки ввода-вывода символов предоставляют удобные средства управления вводом и выводом отдельных символов. С этой целью в них применяется кодировка в Юникоде, допускающая интернационализацию. Кроме того, потоки ввода-вывода символов оказываются порой более эффективными, чем потоки ввода-вывода байтов.

В первоначальной версии Java 1.0 потоки ввода-вывода символов отсутствова­ли, и поэтому весь ввод-вывод имел байтовую организацию. Потоки ввода-выво­да символов были внедрены в версии Java 1.1, сделав не рекомендованным к упо­треблению некоторые классы и методы, поддерживавшие ввод-вывод с байтовой организацией. Устаревший код, в котором не применяются потоки ввода-вывода байтов, встречается все реже, но иногда он все еще применяется. Как правило, устаревший код приходится обновлять, если это возможно, чтобы воспользовать­ся преимуществами потоков ввода-вывода символов.

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

 

Классы потоков ввода-вывода байтов

Потоки ввода-вывода байтов определены в двух иерархиях классов. На верши­не этих иерархий находятся абстрактные классы InputStream и OutputStream. У каждого из этих абстрактных классов имеется несколько конкретных подклас­сов, в которых учитываются отличия разных устройств, в числе файлов на диске, сетевых соединений и даже буферов памяти. Классы потоков ввода-вывода байтов из пакета java.io перечислены в табл. 1. Одни из этих классов описываются ниже. Не следует, однако, забывать о необхо­димости импортировать пакет java.io, чтобы воспользоваться классами потоков ввода-вывода.

Таблица 1. Классы потоков ввода-вывода байтов из пакета java.io

Класс потока ввода-вывода

Назначение

BufferedlnputStream

Буферизированный поток ввода

BufferedOutputStream

Буферизированный поток вывода

ByteArraylnputStream

Поток ввода, читающий байты из массива

ByteArrayOutputStream

Поток вывода, записывающий байты в массив

DatalnputStream

Поток ввода, содержащий методы для чтения данных стандартных типов, определенных в java

DataOutputStream

Поток вывода, содержащий методы для записи данных стандартных типов, определенных в java

FilelnputStream

Поток ввода, читающий данные из файла

FileOutputS tream

Поток вывода, записывающий данные в файл

FilterlnputStream

Реализует абстрактный класс InputStream

FilterOutputStream

Реализует абстрактный класс OutputStream

InputStream

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

ObjectlnputStream

Поток ввода объектов

ObjectOutputStream

Поток вывода объектов

OutputStream

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

Pipedlnpu tS tream

Канал ввода

PipedOutputS tream

Канал вывода

PrintStream

Поток вывода, содержащий методы print() и printlnO

PushbacklnputStream

Поток ввода, поддерживающий возврат одного байта об­ратно в поток ввода

SequencelnputStream

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

В абстрактных классах InputStream и OutputStream определяется ряд клю­чевых методов, реализуемых в других классах потоков ввода-вывода. Наиболее важными среди них являются методы read() и write() , читающие и записыва­ющие байты данных соответственно. Оба эти метода объявлены как абстрактные в классах Inputstream и OutputStream, а в производных классах они переопре­деляются.

 

Классы потоков ввода-вывода символов

Потоки ввода-вывода символов также определены в двух иерархиях классов. На вершине этих иерархий находятся два абстрактных класса — Reader и Writer. Эти абстрактные классы управляют потоками символов в Юникоде. Для каждого из них в java предусмотрен ряд конкретных подклассов. Классы потоков ввода-вы­вода символов перечислены в табл. 2.

Таблица 2. Классы потоков ввода-вывода символов из пакета java.io

Класс потока ввода-вывода

Назначение

BufferedReader

Буферизированный поток ввода символов

BufferedWriter

Буферизированный поток вывода символов

ChaxArrayReader

Поток ввода, читающий символы из массива

CharArrayWriter

Поток вывода, записывающий символы в массив

FileReader

Поток ввода, читающий символы из файла

File Writer

Поток вывода, записывающий символы в файл

FilterReader

Фильтрованный поток чтения

FilterWriter

Фильтрованный поток записи

InputstreamReader

Поток ввода, преобразующий байты в символы

LineNumbe rReader

Поток ввода, подсчитывающий строки

OutputstreaaWriter

Поток вывода, преобразующий символы в байты

PipedReader

Канал ввода

PipedWriter

Канал вывода

PrintWriter

Поток вывода, содержащий методы print() и println()

PushbackReader

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

Reader

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

StringReader

Поток ввода, читающий символы из строки

StringWriter

Поток вывода, записывающий символы в строку

Writer

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

В абстрактных классах Reader и Writer определяется ряд ключевых методов, реализуемых в других классах потоков ввода-вывода. Наиболее важными среди них являются методы read() и write(), читающие и записывающие байты дан­ных соответственно. Оба эти метода объявлены как абстрактные в классах Reader и Writer, а в производных классах они переопределяются.

 

Предопределенные потоки ввода-вывода

Как вам должно быть уже известно, все программы на java автоматически им­портируют пакет java.lang. В этом пакете определен класс System, инкапсули­рующий некоторые свойства исполняющей среды Java. Используя некоторые из его методов, можно, например, получить текущее время и настройки различных параметров, связанных с системой. Класс System содержит также три перемен­ные предопределенных потоков ввода-вывода: in, out и err. Эти переменные объ­явлены в классе System как public, static и final. Это означает, что они могут быть использованы в любой другой части прикладной программы без обращения к конкретному объекту класса System.

Переменная System.out ссылается на стандартный поток вывода. По умолча­нию это консоль. Переменная System.in ссылается на стандартный поток ввода, которым по умолчанию является клавиатура. А переменная System.err ссылает­ся на стандартный поток вывода ошибок, которым по умолчанию также является консоль. Но эти стандартные потоки могут быть перенаправлены на любое совме­стимое устройство ввода-вывода.

Переменная System.in содержит объект типа InputStream, а переменные System.out и System.err содержат объекты типа PrintStream. Это потоки ввода-вывода байтов, хотя они, как правило, используются для чтения символов с консоли и записи символов на консоль. Как будет показано далее, их можно, если требуется, заключить в оболочки потоков ввода-вывода символов.

 

Вас заинтересует / Intresting for you:

Распространенные заблуждения о...
Распространенные заблуждения о... 2490 просмотров Ирина Светлова Thu, 21 Jun 2018, 18:35:12
Выбор среды для разработки код...
Выбор среды для разработки код... 2539 просмотров Stas Belkov Sun, 10 Jun 2018, 14:21:35
Использование потоков в Java
Использование потоков в Java 1459 просмотров Antoni Wed, 12 May 2021, 09:51:36
Аплеты Java и Интернет
Аплеты Java и Интернет 2634 просмотров Ирина Светлова Sat, 09 Jun 2018, 10:17:34
Войдите чтобы комментировать