Странное поведение DataInputStream

Я хотел бы построить хэш-карту из двоичного файла. Этот двоичный файл имеет следующую структуру: первое целое число указывает количество целых чисел, которые я должен прочитать из потока, чтобы построить хэш-карту, за которой следуют пары ключ/значение.

Таким образом, для хэш-карты с тремя значениями у меня будет всего 7 целых чисел:

1 int для чтения - ключ 2 - значение 3 - ключ 4 - значение 5 - ключ 6 - значение 7

Как возможно, что два следующих кода имеют два разных результата? Единственное отличие состоит в том, что в первом примере я использую вспомогательную переменную a для хранения значения байтов для чтения. Во втором я просто использую его непосредственно в цикле for.

static Int2IntMap fetchHashMap(Int2IntMap map, DataInputStream DIS) throws IOException {
    int a = DIS.readInt();
    for (int i = 0; i < a; i++) {
        map.put(DIS.readInt(),DIS.readInt());
    }
    return map;
}

Это код без вспомогательной переменной:

static Int2IntMap fetchHashMap(Int2IntMap map, DataInputStream DIS) throws IOException {
    for (int i = 0; i < DIS.readInt(); i++) {
        map.put(DIS.readInt(),DIS.readInt());
    }
    return map;
}

Первый работает лучше, чем второй, но он все еще не соответствует ожидаемой структуре.

Не знаю, актуально ли это, но моя реализация использует многопоточность, но у каждого потока есть свой DataInputStream.


person Aalto    schedule 26.11.2016    source источник
comment
Что касается вашей потоковой передачи, в которой каждый поток имеет свой собственный DataInputStream, каждый из них также читает из своего собственного файла?   -  person Kayaman    schedule 26.11.2016
comment
да, у каждого потока есть свой файл   -  person Aalto    schedule 26.11.2016


Ответы (1)


Все условие цикла for выполняется перед каждой итерацией. Во втором методе i < DIS.readInt(); запускается перед каждой итерацией, считывая новый int из DIS. Ваш первый метод делает это правильно, читая только один раз и кэшируя значение.

person qxz    schedule 26.11.2016