До сих пор речь шла только о считывании и записи в поток данных в виде byte. Для работы с другими примитивными типами данных Java определены интерфейсы DataInput и DataOutput и их реализации – классы-фильтры DataInputStream и DataOutputStream. Их место в иерархии классов ввода/вывода можно увидеть на рис.15.1.
Интерфейсы DataInput и DataOutput определяют, а классы DataInputStream и DataOutputStream, соответственно, реализуют методы считывания и записи значений всех примитивных типов. При этом происходит конвертация этих данных в набор byte и обратно. Чтение необходимо организовать так, чтобы данные запрашивались в виде тех же типов, в той же последовательности, как и производилась запись. Если записать, например, int и long, а потом считывать их как short, чтение будет выполнено корректно, без исключительных ситуаций, но числа будут получены совсем другие.
Это наглядно показано в следующем примере:
Пример 15.9.
(html, txt)
Результат выполнения программы:
Чтение в правильной последовательности:
readByte: -128 readInt: 128 readLong: 128 readDouble: 128.0
Чтение в измененной последовательности:
readInt: -2147483648 readDouble: -0.0 readLong: -9205252085229027328
Итак, значение любого примитивного типа может быть передано и считано из потока данных.