在我的程序中,我需要检查1000多个文件的MD5哈希值,但不幸的是,由于某种原因,它会导致巨大的内存泄漏。 有没有办法优化我的代码?
(我试过FastMD5,java.nio,java.io等。问题不是实际的代码)
File[] directory = new File("/PATH/TO/FOLDER/WITH/LOTS/OF/FILES").listFiles();
for(int i = 0; i < directory.length;i++){
System.out.println(MD5.asHex(MD5.getHash(directory[i])));
}
答案 0 :(得分:3)
扩展我的评论,这是你应该如何确保关闭文件流以防止内存泄漏:
final File[] directory = new File("/PATH/TO/FOLDER/WITH/LOTS/OF/FILES").listFiles();
for(int i = 0; i < directory.length; i++)
{
try(final FileInputStream file = new FileInputStream(directory[i]))
{
System.out.println(DigestUtils.md5Hex(file));
}
catch(final IOException ex)
{
ex.printStackTrace();
}
}
或者,如果您不使用Java 7:
final File[] directory = new File("/PATH/TO/FOLDER/WITH/LOTS/OF/FILES").listFiles();
for(int i = 0; i < directory.length; i++)
{
FileInputStream file = null;
try
{
file = new FileInputStream(directory[i]);
System.out.println(DigestUtils.md5Hex(file));
}
catch(final IOException ex)
{
ex.printStackTrace();
}
finally
{
if(file != null)
{
try
{
file.close();
}
catch(final IOException ex)
{
//Ignore
}
}
}
}
答案 1 :(得分:1)
我是您当前代码正在使用的FastMD5库的作者。我尝试将此添加为对您的问题的评论,但Stack Overflow表示它太长了,所以我将其作为答案发布,并希望它足够接近让您弄清楚问题。我尝试重现错误,但你提供的示例代码对我来说很好。我创建了一个包含10,000个文件的目录,如下所示:
# mkdir bigdir
# mkdir bigdir
运行代码按预期打印10,000个哈希值,JVM正常退出。
您可以发布您获得的特定堆栈跟踪吗?我怀疑它在MD5计算期间死亡并且内存泄漏可能在其他地方是巧合。如果您遇到特定于操作系统的错误,您是否也可以在不同的操作系统上尝试代码?
我第一次在“〜/ Downloads /”文件夹上尝试代码时注意到的一件事是,当它在目录列表中遇到实际上是目录本身的项时,它抛出了IOException。所以也许你在该目录中有一些不同于文件的东西(例如,无限循环符号链接,重新分析点等)。