0

在我的程序中,我需要检查 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])));

        } 
4

2 回答 2

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
            }
        }
    }
}
于 2013-08-25T23:36:39.500 回答
1

我是您当前代码正在使用的 FastMD5 库的作者。我尝试将此作为评论添加到您的问题中,但 Stack Overflow 说它太长了,所以我将它作为答案发布,并希望它足够接近让您找出问题所在。我尝试重现该错误,但您提供的示例代码对我来说效果很好。我创建了一个包含 10,000 个文件的目录,如下所示:

# mkdir bigdir

# $I=0 ; while test $I -lt 10000 ; do echo $I > bigdir/$I ; done

运行您的代码按预期打印 10,000 个哈希值,并且 JVM 正常退出。

你能发布你得到的特定堆栈跟踪吗?我怀疑它在 MD5 计算期间死亡只是巧合,内存泄漏可能在其他地方。如果您遇到操作系统特定的错误,您是否也可以在不同的操作系统上尝试您的代码?

当我第一次在我的“~/Downloads/”文件夹上尝试你的代码时,我注意到的一件事是,当它在目录列表中遇到一个实际上是一个目录本身的项目时,它会抛出一个 IOException。因此,也许您在该目录中还有一些文件以外的东西(例如,无限循环符号链接、重解析点等)。

于 2013-09-04T18:38:51.443 回答