加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – ReadFully()有窒息的风险吗?

发布时间:2020-12-15 04:11:19 所属栏目:Java 来源:网络整理
导读:我注意到当我在文件而不是read(byte [])上使用readFully()时,处理时间大大减少.然而,我发现readFully可能是一把双刃剑.如果我偶然尝试读取一个巨大的,几千兆字节的文件,它可能会窒息? 这是我用来生成SHA-256校验和的函数: public static byte[] createChec
我注意到当我在文件而不是read(byte [])上使用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)));

这会冒这个风险吗?或者……是最好的选择(在你无法控制数据大小的情况下)总是控制读入的字节数并使用循环直到读取所有字节?

(想想看,因为MessageDigest API一次接收完整的字节数组,我不知道如何在不立即填充所有数据的情况下获得校验和,但我认为这是另一个线程的另一个问题.

解决方法

你应该只分配一个体积适中的缓冲区(可能是65536个字节),并做一个循环,你一次读取64kb,使用“complete.update()”附加到循环内的消化器.小心最后一个块,这样你只处理读取的字节数(可能小于64kb)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读