Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




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

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

В любом случае, для создания автономных приложений или же апплетов, взаимодействующих с сервером WWW через сеть, необходимо познакомиться с классами, предназначенными для ввода и вывода. Приложение Java может работать с потоками нескольких типов:

· со стандартными потоками ввода-вывода;

· с потоками, связанными с локальными файлами;

· с потоками, связанными с файлами в оперативной памяти;

· с потоками, связанными с удаленными файлами.

2.1. Обзор классов Java для работы с потоками

Рассмотрим кратко классы, связанные с потоками.

Для работы со стандартными потоками в классе System имеется 3 статических объекта: System.in, System.out и System.err. Поток System.in связан с клавиатурой, потоки System.out и System.err - с консольным выводом приложения Java.

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

Рассмотрим предварительно иерархию классов, предназначенных для ввода-вывода (пакет java.io). Все основные классы, рассматриваемые далее, произошли от класса Object:

Object → InputStream

Object → OutputStream

Object → RandomAccessFile

Object → File

Object → FileDescriptor

Object → StreamTokenizer

Класс InputStream является базовым для большого количества классов, на базе которых создаются потоки ввода. В основном, именно эти производные классы применяются программистами, так как в них имеется намного более мощные методы, чем в классе InputStream.

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

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

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

С помощью класса FileDescriptor можно проверить идентификатор открытого файла.

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

Классы, производные от InputStream

От класса InputStream производится много других классов, методы которых позволяют работать с потоком ввода не на уровне отдельных байт, а на уровне объектов различных классов, например, класса String. Рассмотрим иерархию производных классов:

Object → InputStream → FileInputStream

Object → InputStream → PipedInputStream

Object → InputStream → SequenceInputStream

Object → InputStream → StringBufferInputStream

Object → InputStream → ByteArrayInputStream

Object → InputStream → FilterInputStream

Object → InputStream → FilterInputStream → BufferedInputStream

Object → InputStream → FilterInputStream → DataInputStream

Object → InputStream → FilterInputStream → LineNumberInputStream

Object → InputStream → FilterInputStream → PushBackInputStream

Класс FileInputStream позволяет создать поток ввода на базе класса File Или FileDescriptor.

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

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

Класс StringBufferInputStream позволяет создавать потоки ввода на базе строк класса String, используя при этом только младшие байты хранящихся в такой строке символов. (Этот класс может служить дополнением для класса ByteArrayInputStream, который также предназначен для создания потоков на базе данных из оперативной памяти.)

При необходимости можно создать входной поток данных не на базе локального или удаленного файла, а на базе массива, расположенного в оперативной памяти. Класс ByteArrayInputStream предназначен именно для этого - конструктору класса передается ссылка на массив и в итоге создается входной поток данных, связанный с этим массивом. (Потоки в оперативной памяти могут быть использованы для временного хранения данных. Так как апплеты не могут обращаться к локальным файлам, для создания временных файлов можно использовать потоки в оперативной памяти на базе ByteArrayInputStream. Другую возможность создания временных файлов предоставляет пользователю класса StringBufferInputStream.)

Класс FilterInputStream является абстрактным классом, на базе которого создаются все следующие рассматриваемые классы потоков ввода.

Буферизация операций ввода и вывода в большинстве случаев значительно ускоряет работу приложений, так как при ее использовании сокращается количество обращений к системе для обмена данными с внешними устройствами. Класс BufferedInputStream может быть использован для организации буферизированных потоков ввода. Конструктору этого класса в качестве параметра передается ссылка на объект класса InputStream. Таким образом, нельзя просто создать объект класса BufferedInputStream, не создав при этом объект класса InputStream.

Очень часто возникает необходимость записывать в потоки данных и читать оттуда данные не только на уровне байт или текстовых строк, но объекты других типов, например, целые числа или числа типа double, массивы и т.д. Класс DataInputStream содержит методы, позволяющие извлекать из входного потока данные в перечисленных выше форматах (выполнять форматированный ввод данных). Этот класс также реализует интерфейс DataInput, служащий для этой цели.

С помощью класса LineNumberInputStream можно работать с текстовыми потоками, состоящими из отдельных строк, разделенных символами возврата каретки \r и перехода на следующую строку \n. Методы этого класса позволяют следить за нумерацией строк в таких потоках.

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

Классы, производные от OutputStream

Класс OutputStream предназначен для создания потоков вывода. Приложения, как правило, непосредственно не используют этот класс для операций вывода, так же как и класс InputStream для операций ввода. Вместо этого применяются классы, имеющие следующую иерархию:

Object → OutputStream → FileOutputStream

Object → OutputStream → PipedOutputStream

Object → OutputStream → ByteArrayOutputStream

Object → OutputStream → FilterOutputStream

Object → OutputStream → FilterOutputStream → BufferedOutputStream

Object → OutputStream → FilterOutputStream →DataOutputStream

Object → OutputStream → FilterOutputStream → PrintStream

Класс FileOutputStream позволяет создать поток вывода на базе класса File или FileDescriptor.

Классы PipedOutputStream и PipedInputStream предназначены для организации двусторонней передачи данных между двумя одновременно работающими задачами многопоточного приложения.

С помощью класса ByteArrayOutputStream можно создать поток вывода в оперативную память.

Абстрактный класс FilterOutputStream служит базовым классом для всех рассматриваемых ниже потоков вывода.

Класс BufferedOutputStream предназначен для создания буферизированных потоков вывода. Как уже отмечалось, буферизация ускоряет работу приложения.

С помощью класса DataOutputStream приложения Java могут выполнять форматированный вывод данных. Класс DataOutputStream реализует интерфейс DataOutput.

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

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

Для работы со стандартными потоками в классе System имеется 3 статических объекта: System.in, System.out и System.err. По своему назначению эти потоки больше всего напоминают стандартные потоки ввода, вывода и вывода сообщений об ошибках операционной системы MS-DOS.

Поток System.in (стандартный поток ввода) связан с клавиатурой, потоки System.out (стандартный поток вывода, вывод при помощи этого потока может быть переназначен в файл) и System.err (стандартный поток вывода ошибок) - с консольным выводом приложения Java.

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




Поделиться с друзьями:


Дата добавления: 2014-11-20; Просмотров: 399; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.