Главная » Java » Ввод-вывод в Java

0

 

Пользователь, с точки зрения программиста, —

это периферийное устройство, которое осуществляет ввод информации,

если программа выполняет инструкцию read.

 Питер Уилльямз (Peter Williams)

 

     Функции ввода-вывода (input/output, или I/O) информации, реализованные в составе стандартного пакета Java.io, определены в терминах потоков данных (streams). Потоки данных — это упорядоченные последовательности данных, которым соответствует определенный источник (source) (для потоков ввода) или получатель (destination) (для потоков вывода). Классы ввода-вывода Java исключают необходимость вникать в особенности низкоуровневой организации операционных систем и предоставляют доступ к системным ресурсам посредством методов работы с файлами и иных инструментов. Большинство типов потоков данных (например, тех, которые реализуют файловые операции) поддерживает методы определенных базовых интерфейсов и абстрактных классов с некоторыми дополнениями (если таковые уместны). Чтобы преуспеть в освоении средств пакета ввода-вывода, целесообразно рассмотреть вначале именно базовые интерфейсы и абстрактные классы. Затем мы продемонстрируем примеры практического воплощения абстрактных моделей в конкретных типах потоков данных.

Пакет   java.iо   охватывает   определения   типов   двух   основных   разновидностей —   символьных   потоков   (character   streams)   и   байтовых   потоков   (byte streams) данных. Под символьными потоками понимаются последовательности 16-битовых символов Unicode, а каждому байту, как всегда, отвечает порция данных Длиной в восемь бит. Ввод-вывод может быть либо текстовым (text-based), либо бинарным (binary). Функции текстового ввода-вывода способны обращаться с потоками символов, поддающихся восприятию человеком (например, с исходными текстами программ), а средства обработки бинарных данных имеют дело с информацией, хранящейся в двоичном виде (скажем, с битовыми представлениями графических изображений). Символьные потоки используются в операциях текстового ввода-вывода, а байтовые — при работе с бинарными данными. Потоки, ориенированные   на   поддержку   байтовых   данных,    вообще   говоря,    не   способны коректно переносить символьную информацию, и некоторые аспекты обработки оследовательностей   символов   в   контексте   байтовых   потоков   просто   лишены ысла, хотя последние могут с успехом применяться для представления символов а основе устаревших 7- и 8-битовых протоколов. Байтовые потоки принято называть потоками ввода (input streams) и потоками вывода (output streams), а символьные — потоками чтения (readers) и потоками записи (writers). Почти для каждого потока ввода существует соответствующий поток вывода, а для большинства потоков ввода и вывода определены символьные потоки чтения и записи, обладающие схожими функциональными чертами, и наоборот.

   Принимая во внимание указанное единство характеристик классов потоков мы рассмотрим их в обобщенных терминах. То, что будет сказано о потоках в целом, можно отнести к любому из типов потоков. Говоря о потоках ввода и вывода, мы имеем в виду байтовые потоки, а на символьные потоки ссылаемся как на потоки чтения и записи. Например, все выводы, касающиеся поведения потоков Buffered, можно распространить на целое семейство потоковых классов BufferedlnputStream, BufferedOutputStream, BufferedReader и BufferedWriter. Если мы говорим о байтовых потоках Buffered, то подразумеваем как BufferedlnputStream, так и BufferedOutputStream. Когда же речь идет о символьных потоках Buffered, имеются в виду как BufferedReader, так и Bufferedwriter.

   Классы и интерфейсы из состава пакета java.iо можно условно разделить на

пять обширных групп:              

- типы общего назначения, служащие для построения различных типов бай

товых и символьных потоков, — потоки ввода и вывода, чтения и записи, а

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

ними

- классы, определяющие разновидности потоков — фильтрованные потоки

(filtered streams), буферизованные потоки (buffered streams),  канальные

потоки (piped streams), — а также специальные подвиды таких потоков,

такие как поток чтения строк с сохранением нумерации (line  number

reader) и лексический анализатор потока чтения (stream tokenizer);

- специализированные потоковые классы и интерфейсы для ввода и вывода зна

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

от особенностей платформы; рассмотрены в разделе 15.6 на странице 408;

-          классы     и     интерфейсы,      поддерживающие     механизм     сериализации

(serialization) объектов, который позволяет преобразовывать объект в бай

товый поток и при необходимости восстанавливать его из данных потока;

рассмотрены в разделе.

   Классы из состава пакета Java.text, описанные в главе 19, могут использоваться для решения некоторых задач форматирования чисел, а в классах-оболочках, служащих для представления целых чисел (см. раздел 11.1.5), реализован ряд методов для извлечения чисел из объектов строк, но единого набора классов, выполняющих форматированный ввод-вывод, в Java не существует.

   Объекты класса IOException используются многими методами ввода-вывода в качестве сигнала о возникновении исключительной ситуации. Некоторые классы, производные от IOException, служат для представления конкретных проблем ввода-вывода, но в большинстве случаев используются объекты IOException со строкой, содержащей описание ошибки (более подробная информация приведена в разделе 15.8). Метод, предусматривающий возможность выбрасывания исключения IOException, генерирует такое исключение при появлении любой ошибки, непосредственно связанной с операцией ввода-вывода. В частности, выбрасыванием исключения IOException завершится попытка вызова метода по отношению к закрытому потоку. Исключение IOException далее не будет упоминаться в описаниях конкретных методов каждого из классов, кроме тех случаев, когда его возникновение связано с особыми обстоятельствами.

  Аналогично, при передаче методу в качестве параметра значения null или задании значения индекса, выходящего за пределы допустимого диапазона, обычно выбрасываются объекты исключений Null PointerException и indexOutOfBoundsException соответственно. Мы будем особо оговаривать только такие ситуации, которые связаны с теми или иными отступлениями от этого правила.

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

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии