Как проверить тип данных из DataInputStream перед считыванием?
Из массива, содержащего данные типов int, double, String, после проверки типа, записываю их в файл с помощью DataOutputStream методами writeInt(), writeDouble(), writeUTF()/writeChars() соответственно.
Как затем проверить типы данных при считывании их с помощью DataInputStream, чтобы выбрать правильный метод readInt(), readDouble(), readUTF()?
Ответы (1 шт):
Никак.
Если сунуться в исходники, то например writeInt(), реализован так:
public final void writeInt(int v) throws IOException {
out.write((v >>> 24) & 0xFF);
out.write((v >>> 16) & 0xFF);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
incCount(4); //инкремент указателя потока записи
}
То есть по сути идет запись битов/байтов без указания его типа. И так со всеми остальными типами - записываются голые байты.
Чтобы различать что у вас там записано, вам нужно перед каждой записью вставлять, например байт/тег, который показывает тип следующей записи, типа:
static final byte TYPE_INT=1;
static final byte TYPE_DOUBLE=2;
os.writeByte(TYPE_DOUBLE);
os.writeDouble(d);
os.writeByte(TYPE_INT);
os.writeInt(i);
Соответственно, при чтении читать байт указывающий тип и ветвиться по его типу что дальше читать.
Вообще по хорошему это все костыли и вам надо смотреть в сторону ObjectOutputStream/ObjectInputStream и читать писать сразу объекты через интерфейс Serializable, а то и вовсе перейти на Json - но это уже совсем другая история.