DigestInputStream --还是与下载有关的


当一个任务下载完成之后,肯定得考虑文件是否下载完整。所以就会涉及到文件校验,常用的当然还是通过MD5摘要来校验。

习惯性的想到的就是,从服务器端拿到资源文件的MD5码,然后不断的读取本地文件并调用MessageDigest.update(byte) 方法来生成摘要,然后与服务器端的MD5码比较。

但是如果文件过大的话,仅生成本地文件的MD5码就会浪费大量的时间。

其实本身java中就提供了一个DigestInputStream 的类,就可以生成本地文件的MD5码(当然,也可以使用DigestOutputStream来生成 。

这个流在在读取资源文件的过程中就update 了Digest(当然 DigestOutputStream 即write方法调用的过程中更新了摘要)


MessageDigest digest = MessageDigest.getInstance("MD5");
		FileInputStream in = new FileInputStream(new File(filePath));
		DigestInputStream stream = new DigestInputStream(in, digest);
		byte[] bs = new byte[1024];
		while((stream.read(bs))!=-1){
			//TODO
		}
                // 循环结束后,则digest已经更新完毕了。
		System.out.println((stream.getMessageDigest())==digest);//输出true 他还是原来的他.

当然,这个digest在调用digest方法之前,还是可以继续更新的。 一个很使用的场景就是断点续传。 通过前半部分代码,可以已下载完成的文件内容生成摘要,然后从服务器上的资源文件对应位置获取到输入流的时候,继续使用这个digest来进一步更新。当下载完成之后,则这个摘要也更新完毕,就可以直接比较了。


当然这个包装流的封装实现也非常简单。只在read 或者write 方法的byte的时候,调用MessageDigest.update(byte) 也是一样的




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值