Главная » Java » Outputstream в Java

0

 

  Абстрактный     класс     Outputstream     во     многом     аналогичен     классу Inputstream;   он   предлагает   модель   вывода   байтовых   данных   в   объект-получатель. Методы класса Outputstream перечислены ниже.

 

public abstract void write(int b)  throws lOException .

Выводит значение Ь в виде байта. В качестве параметра передается именно int, поскольку значение часто является результатом выполнения арифметических операций над аргументами byte. Выражение, операнды которог относятся к типу byte, обладает типом int, поэтому объявление параметра в виде int означает возможность избежать необходимости использова ния операций явного преобразования результатов вычисления выражении к типу byte. Следует заметить, однако, что выводится только 8 младших битов результата типа int. Метод выполняет блокировку до тех пор, пока байт не выведен.

 

public void writeCbyte[]  buf,   int offset,  int count)

throws  lOException

Выводит count байтов массива buf,  начиная с элемента buf [off set]. Метод выполняет блокировку до тех пор, пока байты не выведены.

 

 public void write(byte[]  buf) throws lOException

Метод аналогичен предыдущему при условии write(buf, 0, buf.length).

 

public void flushO  throws lOException

Осуществляет сброс (flush) потока. Если поток сохраняет в промежуточном буфере некоторое число байтов, переданных методами write различных версий, flush провоцирует выполнение операции непосредственного вывода данных в объект-получатель. Затем, если получателем является другой поток, тот в свою очередь также сбрасывается. Таким образом, единственный вызов flush приводит к сбросу всех буферов в цепочке взаимосвязанных потоков. Если поток не относится к категории буферизованных, реализация метода, предлагаемая по умолчанию, не предусматривает выполнения каких бы то ни было действий.

 

public void close()  throws  lOException

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

   При реализации Outputstream требуется, чтобы производный класс обеспечил практическое воплощение варианта метода write, осуществляющего вывод единственного байта, поскольку остальные версии write основываются на первой. Во многих случаях, однако, производительность операций может быть улучшена за счет переопределения и других методов. Исходные версии методов flush и close нуждаются в переопределении в соответствии с потребностями конкретных типов потоков — в частности, перед закрытием буферизованного потока разумно выполнять его сброс.

  Ниже приведен пример программы, которая копирует вводимые данные в поток вывода, выполняя замену всех встреченных байтов, содержащих определенное значение, другим байтовым значением. Программе TranslateByte в качестве параметров передаются два значения — байт from и байт to. Байты из стандартного потока ввода, которые содержат значение, равное from, преобразуются в to.

 

import java.io.*;

class TranslateByte  {

public static void main(String[]   args)

 throws  lOException

{

byte  from =  (byte)args[O].charAt(O);

 byte  to      =  (byte)args[l].charAt(O);

int b;

while  C(b = System.in.read())   != -1)

    System.out.write(b == from ? to  :   b);

   }

}

Если, например, вызвать программу таким образом, как показано ниже

   java TranslateByte б Б

 а затем ввести с клавиатуры текст

   абракадабра!

результатом окажется строка

  аБракадаБра!

   Для выполнения относительно несложных манипуляций с данными после их ввода из потока либо перед выводом в поток зачастую вместо программирования соответствующих инструкций применяются средства потоков типа Fi 7 ter (за подробностями обращайтесь к разделу 15.4.2).

   Упражнение 15.1. Перепишите текст программы TranslateByte в виде метода, который транслирует содержимое потока inputStream в поток OutputStream и в качестве параметров, наряду с парой соответствующих байтов, получает также ссылки на объекты потоков. Для каждого типа InputStream и OutputStream, которые будут рассмотрены в этой главе, создайте отдельный метод, реализующий необходимый алгоритм преобразования. Если потоки ввода и вывода относятся к "родственным" типам, можно обойтись одним вариантом метода.

 

 

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

По теме:

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