
Данные, записанные с помощью DataOutputStream должны быть прочитаны только посредством DataInputStream, причём обязательно в том же порядке, в котором они были записаны.
DataOutputStream записывает байты для определённого типа данных. Каждый тип данных интерпретируется по-своему и занимает своё количество байт. Например, int занимает 4 байта, а double - 8 байт. Каждая операция записи преобразует свой тип данных в соответствующий ему набор байт. Аналогичным образом поступают и операции считывания: они создают требуемый тип данных из доступных байт.
Поэтому если данные будут считаны не в том порядке, в котором они были записаны, можно получить неожиданный результат.
FileOutputStream fos = new FileOutputStream(new File("myData.data"));
DataOutputStream dos = new DataOutputStream(fos);
FileInputStream fis = new FileInputStream("myData.data");
DataInputStream dis = new DataInputStream(fis);
dos.writeChar('A');
dos.writeDouble(99.0);
dos.writeBoolean(true);
System.out.println(dis.readInt()); // 4276312
System.out.println(dis.readInt()); // -1073741824
System.out.println(dis.readBoolean()); // false
И так развлекаться можно бесконечно:
System.out.println(dis.readBoolean()); // false
System.out.println(dis.readChar()); // 䅀
System.out.println(dis.readDouble()); // 3.2278123476086365E119