Главная » Java » Datalnput и DataOutput в Java

0

  Интерфейсы, предусматривающие потоковый ввод и вывод бинарных данных, обладают почти одинаковой структурой. Методы семейств read и write, обеспечивающие ввод и вывод данных каждого из простых типов, перечислены в следующей таблице.

 

 

Read                                                     Write                                       Тип

 

readBoolean                                       writeBoolean                           boolean

readChar                                             writeChar                                 char

readByte                                             writeByte                                   byte

readShort                                            writeShort                                short

readInt                                                writeInt                                       int

readLong                                            writeLong                                  long

readDouble                                         writeDouble                              double

readUTF                                             writeUTF                                String  (в формате UTF)

 

UTF (от Unicode Transformation Format) — формат преобразования Unicode.1 Символы Unicode передаются в соответствии со спецификацией Unicode-1-l-UTF-8, определяющей компактный бинарный формат, предназначенный для кодирования 16-битовых символов Unicode посредством 8-битовых байтов. Преобразование символов Unicode в байты все еще является актуальной задачей ввиду продолжающегося перехода с 8-битовых к 16-битовым наборам символов.

   Помимо перечисленных в таблице методов read, в составе интерфейса Datalnput есть ряд других методов — некоторые из них схожи с соответствующими членами класса InputStream.

 

public abstract void  readFully(byte[]  buf,   int offset,   int count)

    throws  lOException

Осуществляет ввод данных из потока в часть байтового массива buf. Наибольшее количество байтов, подлежащих считыванию, задается параметром count. Байты сохраняются в элементах массива, начиная с buf [offset] и заканчивая buf [offset+count-1]. Если содержимое count равно нулю, ввод данных не производится. Метод выполняет блокировку до тех пор, пока имеются доступные для ввода байты, не достигнут конец потока (в этом случае генерируется исключение типа EOFException) либо не выброшено исключение, связанное с ошибкой ввода-вывода.

public abstract void readFully(byte[] buf) throws lOException

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

public abstract int skipBytes(int count)  throws lOException

Предпринимает попытку пропустить count байтов, причем пропущенные байты утрачиваются. Возвращает количество фактически пропущенных байтов. Метод никогда не выбрасывает исключения EOFException.

public abstract int  readunsignedByte()  throws lOException

Считывает один байт, расширяя его содержимое посредством нулевых разрядов до размера типа i nt, и возвращает значение в диапазоне от О Д° 255. Метод удобен для считывания байтов, сохраненных методом writeByte интерфейса DataOutput, если аргументом при вызове метода было значение из промежутка от 0 до 255.

public abstract int readunsignedShortQ  throws  lOException

Считывает два байта и возвращает значение int в диапазоне от 0 до 65535. Первый считываемый байт воспринимается как старший. Метод удобен для считывания байтов, сохраненных методом writeshort интерфейса DataOutput, если аргументом при вызове метода было значение из промежутка от 0 до 65535.

  Методы интерфейса Datalnput обычно реагируют на событие достижения конца потока, выбрасывая исключение типа EOFException, производного от lOException.

  Интерфейс DataOutput поддерживает сигнатуры, равнозначные трем формам метода write класса OutputStream, и, помимо того, ряд методов, перечисленных ниже.

 

 

 public abstract void writeBytes(String s)  throws lOException

Выводит в поток содержимое строки S в виде последовательности байтов. Старший байт каждого символа утрачивается, поэтому, если потеря данных нежелательна, к методу следует обращаться только в тех случаях, когда исходная строка содержит символы с кодами, принадлежащими интервалу от \u0000 до \uOOff.

 public abstract void writeChars(String s)  throws lOException

Выводит в поток содержимое строки S в виде последовательности значений char. Каждый символ сохраняется в виде пары байтов, и старший байт выводится первым.

  Методов readBytes и readChars, позволяющих ввести то же количество байтов, которое было выведено методами writeBytes или writeChars, увы, не существует, поэтому для ввода таких данных следует использовать вызовы readByte или readChar в теле цикла. Для этого необходимо обеспечить хранение информации о длине строки — например, записывая ее перед содержимым строки либо отмечая конец строки специальным признаком. Если при сохранении последовательности данных первой записывается ее длина, массив байтов может быть введен посредством метода readFully. Такой подход, однако, окажется неверным, если для вывода применялся метод writeChars, поскольку считываться должны значения char, а не byte.

 

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

По теме:

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