【发布时间】:2014-06-18 17:10:42
【问题描述】:
此代码将计算 URI 的哈希值:
protected void ShowHash(android.net.Uri uri) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
BufferedInputStream is = new BufferedInputStream(getContentResolver().openInputStream(uri));
DigestInputStream dis = new DigestInputStream(is, md);
while(dis.read() != -1) ;
Toast.makeText(getApplicationContext(), bytesToHex(md.digest()),
Toast.LENGTH_LONG).show();
} catch(Exception e) {
Toast.makeText(getApplicationContext(), e.toString(),
Toast.LENGTH_LONG).show();
}
return;
}
但是对于一个大小合适的文件(例如,一张 2MB 的图片),这将挂起大约 10 秒,这是一个荒谬的时间。显然有比while(dis.read() != -1) ; 更好的方法来处理整个文件;我该怎么办?
【问题讨论】:
-
不确定是否可以更快地完成,因为我很少接触散列,但只是一个提示:我认为最好将其放在
AsyncTask或Thread上,而不是防止锁定 UI。 Official doc -
也许可以试试其他版本的
read()读入一个数组? docs.oracle.com/javase/7/docs/api/java/security/…, int, int) -
当然可以,但您仍在等待大约 10 秒 :)
-
如果我不想要内容(假设这是一个 3GB 的文件),如何避免不必要的副本堵塞内存?
-
那么可以分块读取文件吗?分配一些大小的数组并调用
read(),但是您需要多次访问整个文件?