Я заметил, что при использовании readFully()
в файле вместо чтения (байт []) время обработки значительно сокращается. Однако мне показалось, что readFully может быть обоюдоострым мечом. Если я случайно попытаюсь прочитать в огромном многогигабайтном файле, это может задохнуться?ReadFully() Возникает риск удушения?
Вот функция, я использую для создания SHA-256 контрольной суммы:
public static byte[] createChecksum(File log, String type) throws Exception {
DataInputStream fis = new DataInputStream(new FileInputStream(log));
Long len = log.length();
byte[] buffer = new byte[len.intValue()];
fis.readFully(buffer); // TODO: readFully may come at the risk of
// choking on a huge file.
fis.close();
MessageDigest complete = MessageDigest.getInstance(type);
complete.update(buffer);
return complete.digest();
}
Если бы я вместо этого использовать:
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(log)));
бы, allieviate этот риск? Или ... лучший вариант (в ситуациях, когда вы не можете использовать размер данных), чтобы всегда контролировать количество прочитанных байтов и использовать цикл до тех пор, пока все байты не будут прочитаны?
(Подумайте об этом, так как API MessageDigest сразу принимает полный массив байтов, я не уверен, как достичь контрольной суммы, не набирая сразу все данные, но я полагаю, что это еще один вопрос для другой нити.
Метод 'update()', который вы используете, не требует всех данных. Вы можете вызывать его несколько раз за дайджест. – erickson