文件流上的资源泄漏警告

时间:2012-10-16 09:31:18

标签: android file-io resource-leak

private void SaveLog(boolean externalStorage)
{
    String s = tv_log.getText().toString();
    File file;
    FileOutputStream fos;

    if ( externalStorage )
    {
        try
        {
            file = new File(getExternalFilesDir(null), FILE_LOG);
            fos = new FileOutputStream(file);  // Warning: Resource leak: 'fos' is never closed
        }
        catch(FileNotFoundException e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
            return;
        }
    }
    else
    {
        try
        {
            fos = openFileOutput(FILE_LOG, Context.MODE_PRIVATE);
        }
        catch(FileNotFoundException e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
            return;
        }
    }


    try
    {
        fos.write(s.getBytes());
        fos.close();
    }
    catch(IOException e)
    {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        return;
    }
}

为什么警告显示在fos = new FileOutputStream(file)行中?有趣的是,如果我删除if ( externalStorage )并仅留下第一个分支,则不会显示警告:

private void SaveLog(boolean externalStorage)
{
    String s = tv_log.getText().toString();
    File file;
    FileOutputStream fos;

    try
    {
        file = new File(getExternalFilesDir(null), FILE_LOG);
        fos = new FileOutputStream(file);  // OK!
    }
    catch(FileNotFoundException e)
    {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        return;
    }

    try
    {
        fos.write(s.getBytes());
        fos.close();
    }
    catch(IOException e)
    {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        return;
    }
}

2 个答案:

答案 0 :(得分:1)

我相信在您的特定情况下,没有任何资源泄漏的可能性,因为行fos = new FileOutputStream(file);try组结束前的最后一行,如果您有例外这里不会创建资源fos

但是,如果您在该行之后有一个语句,该语句可能会产生异常,执行将移至catch组,该组以返回方式终止而不释放{{1}中分配的资源}组。

避免警告的最简单方法是在try中添加以下内容:

catch

如果出现异常,这将确保释放资源。

答案 1 :(得分:0)

在每个catch块中,使用fos.close()关闭流。

否则,程序可能会点击try块,生成异常并转到catch块而不关闭流。这可能会导致错误。