我注意到当我readFully()
在文件上使用而不是 read(byte[]) 时,处理时间大大减少。但是,我突然想到 readFully 可能是一把双刃剑。如果我不小心尝试读取一个巨大的、数 GB 的文件,它会窒息吗?
这是我用来生成 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)));
这会减轻这种风险吗?或者...是始终控制读取的字节量并使用循环直到读取所有字节的最佳选择(在您无法保证数据大小的情况下)?
(想想看,由于 MessageDigest API 一次接收完整的字节数组,我不确定如何在不一次填充所有数据的情况下获得校验和,但我想这是另一个线程的另一个问题。