Java читает файл в память и как не взорвать память

Я немного новичок в Java и пытаюсь выполнить вычисление MAC для файла. Теперь, поскольку размер файла неизвестен во время выполнения, я не могу просто загрузить весь файл в память. Поэтому я написал код, чтобы он читался битами (в данном случае 4k). Проблема, с которой я столкнулся, заключается в том, что я попытался загрузить весь файл в память, чтобы увидеть, создают ли оба метода один и тот же хеш. Однако кажется, что они производят разные хеши.

Вот побитовый код:

FileInputStream fis = new FileInputStream("sbs.dat");
byte[] file = new byte[4096];
m = Mac.getInstance("HmacSHA1");
int i=fis.read(file);
m.init(key);
while (i != -1)
{
    m.update(file);
    i=fis.read(file);
}
mac = m.doFinal();

А вот подход «все сразу»:

File f = new File("sbs.dat");
long size = f.length();
byte[] file = new byte[(int) size];
fis.read(file);
m = Mac.getInstance("HmacSHA1");
m.init(key);
m.update(file);
mac = m.doFinal();

Разве они не должны генерировать один и тот же хеш?

Но вопрос в другом. общий. Является ли 1-й код правильным способом загрузки файла в память по частям и выполнения того, что мы хотим делать внутри цикла while? (отправка сокета, шифрование файла и т. д.). Этот вопрос полезен, потому что каждый учебник, который я видел, просто загружает все сразу ...

Обновление: Работает :-D. Будет ли этот подход работать правильно при отправке файла по частям через сокет?

5
задан ROMANIA_engineer 11 March 2017 в 22:17
поделиться