select
`getLatest`.`last_bug_id`
, `mantis_bug_history_table`.`date_modified`
, `mantis_bug_history_table`.`old_value`
, `mantis_bug_history_table`.`new_value`
from
(
select
(
select
`bug_id`
from
`mantis_bug_history_table`
where
`date_modified` > unix_timestamp() - 14*24*3600 -- two weeks
and `field_name` like 'severity'
and `bug_id` = `prepared_bug_list`.`bug_id`
order by
`date_modified` desc
limit 1
) as `last_bug_id`
from
`prepared_bug_list`
) as `getLatest`
inner join `mantis_bug_history_table`
on `prepared_bug_list`.`bug_id` = `getLatest`.`last_bug_id`
order by `getLatest`.`bug_id` ASC
所以在上面的代码中我得到以下结果:
try (InputStream is = item.getInputStream())
{
final MD5DigestCalculatingInputStream digestStream = new MD5DigestCalculatingInputStream(is);
final byte[] bytes = IOUtils.toByteArray(digestStream);
final String newFileName = Hex.encodeHexString(digestStream.getMd5Digest()) + "."
+ FilenameUtils.getExtension(item.getName());
final String newFileName2 = Hex.encodeHexString(digestStream.getMd5Digest()) + "."
+ FilenameUtils.getExtension(item.getName());
}
(正确)
newFileName = e9f08a9c181551336e58119edd23109b.png
(错误!)
以下所有结果也类似于newFileName2。无论正确的newFileName是什么,newFileName2将始终与上面显示的值相同。我真的不知道这个问题是什么情况?
答案 0 :(得分:3)
getMD5Digest方法调用MessageDigest.digest。
MessageDigest.digest的文档说
完成此调用后,摘要将重置。
https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html#digest()
因此,第一个名称是输入流的MD5摘要。第二个名称是新重置摘要的MD5,这就是它始终相同的原因。
答案 1 :(得分:0)
我敢打赌,MD5DigestCalculatingInputStream.getMd5Digest()会使用该流。这意味着第一个调用会消耗摘要,后续调用会返回一个空摘要,然后会产生相同的错误结果。