当前位置: 首页 > 知识库问答 >
问题:

IOUtils怎么样。隐藏“资源泄漏”警告?

胡永逸
2023-03-14

我在IOUtils上使用了一个很好的函数,名为“closequity”,它可以关闭流,不管流中有什么。

例如:

InputStream input = null;
try
  {
  ...
  input = connection.getInputStream();
  ...
  } 
catch(Exception e)
  {
  }
finally
  {
  IOUtils.closeQuietly(input);
  }

不知何故,当我在最后一个块中调用它时,它也隐藏了Eclipse上的警告,即“资源泄漏:‘输入’在此位置未关闭”。

这意味着在上述代码中,没有此类警告。

我不明白它是如何隐藏对自身“外部世界”的警告的。

我试图通过复制这个库的代码来检查它(这里的例子),但是当我在新类上使用它时,警告会出现。这没有意义...

下面是我创建的一个示例代码,用于显示警告将出现在您自己的类上:

public class MyIOUtils {
    public static void closeQuietly(final InputStream input) {
        if (input == null)
            return;
        try {
            input.close();
        } catch (final IOException ioe) {
        }
    }

    public static void closeQuietly(final OutputStream output) {
        if (output == null)
            return;
        try {
            output.close();
        } catch (final IOException ioe) {
        }
    }
}

用法:

public class Test {
    public void test() {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream("dummyFile.txt");
            int t = 0;
            --t;
            if (t < 0)
                return; // here you will get a warning
        } catch (final FileNotFoundException e) {
        } finally {
            MyIOUtils.closeQuietly(inputStream);
        }
    }
}

以下是我看到的,包括我安装的Eclipse版本:

它是怎么做到的?

共有2个答案

牟稳
2023-03-14

我无法在Eclipse安装中重现这个问题,因此无法测试我的解释。然而,这就是我们在http://www.google.com/url?sa=t

资源包装器和无资源闭包

JDK定义了一些实现Closeable但不直接表示操作系统级别的资源的类。

JAVA伊奥。StringReader是不需要调用close()的closeable的一个例子,因为没有需要清理的操作系统资源。分析使用显式白名单来检测来自java的类。属于这一类的信息。没有发布有关这些类的资源泄漏警告。

类的实例,比如java。伊奥。BufferedInputStream是另一个资源的包装器(包装器可以在多个级别上应用)。此外,这些对象并不直接表示操作系统资源。如果包装的资源已关闭,则包装器不需要关闭。相反,如果包装被关闭,这将包括关闭包装的资源。该分析还有第二个白名单,用于检测包装器资源,并将识别底层实际资源是否将通过包装器直接或间接关闭。任何一个都足以消除有关资源泄漏的警告。白名单包含来自java的类。伊奥,爪哇。util。爪哇。安全,java。豆子和java。声音取样。

提示:通常最好/最安全的是关闭最外层的包装器,而不是包装的资源。

根据IOUtils留档,这个类中读取流的所有方法都在内部缓冲。这意味着没有理由使用BufferedInputStream或BufferedReader。4K的默认缓冲区大小在测试中被证明是有效的。

秋飞鸾
2023-03-14

那么为什么它对IOUtils有效呢?eclipse团队做了一件非常简单的事情——他们对方法进行了硬编码!在eclipse的早期版本中,警告也存在,但从版本4.3 M4开始,警告就消失了,因为他们修复了它:

Released for 4.3 M4 via commit 277792ba446c3713bcfdc898c37875d45fc06c18.

The fix covers the following well-known methods:
- com.google.common.io.Closeables.closeQuietly(Closeable)
- com.google.common.io.Closeables.close(Closeable,boolean)
- org.apache.commons.io.IOUtils.closeQuietly(Closeable)

有关详细信息,请参见此处,尤其是最后的评论。。。

更新:那么这对你意味着什么?你必须使用其中一种obove方法,否则就必须接受警告。检查基本上不复杂,也不检查下一个级别。

更新二:他们基本上硬编码了文件名。也许用源代码更容易理解。想象这是检查警告的日蚀代码:

public boolean showResourceWarning(){

//do somestuff to detect whether a potential ressource warning is shown
...
    if(resourceLeakWarning){
      if(this.checkForExceptions()){
       return false;
      }
    }
 return resourceLeakWarning;
}

private boolean checkForExceptions(){
    if(name.equals("org.apache.commons.io.IOUtils.closeQuietly(Closeable)"){
     return true;
    }
    if(name.equals("com.google.common.io.Closeables.close(Closeable,boolean)")){
     return true;
    }
    if(name.equals("org.apache.commons.io.IOUtils.closeQuietly(Closeable)")){
     return true;
    }
    // code executed for your method:
    return false;
}

=

更新三:看看下面的类TypeConstants。JAVA你看到里面的名字了吗?如果你想让它与你的代码一起工作,你需要在那里添加你的类和方法名,然后重新编译eclipse。然后看MessageSend类。java从第90行开始。

 类似资料:
  • 我是个新手。我已经编写了这段代码,它显示那里存在资源泄漏 这是什么意思?抱歉,我太天真了。

  • 在中,我收到了一个警告,我不明白这一点。 这是理解问题还是java/eclipse问题?

  • 我正在读取一个文件并将其内容存储在字符串中。代码给了我一个警告:Resource leak:。我如何解决它?

  • eclipse“潜在资源泄漏”警告不正确。 没有警告: 警告:潜在资源泄漏:“此位置可能未关闭响应” 为什么第二种方法会引起警告? 谢谢!

  • Eclipse Java警告:资源泄漏:“Unassigned Closeable Value”从不关闭 漏在哪里?

  • 大家晚上好。我是一个使用Java编程的完全初学者,我正在学习“扫描仪”,但是当我在Eclipse中键入这个基本代码时,我收到一条消息说“资源泄漏:‘扫描仪’永远不会关闭。 我做错了什么?