java - Class.getResourceAsStream 应该关闭吗?

标签 java

我想知道这是否是必需的,因为当我使用此方法时,正在从类路径中读取文件。 “不关闭”是否会导致内存泄漏。

如何测试此类内存泄漏?

最佳答案

您假设 Class.getResourceAsStream() 将始终返回指向您的类的 JAR 文件中的文件的流。这是不正确的。您的类路径也可能包含文件夹,在这种情况下,Class.getResourceAsStream() 将返回 FileInputStream。其他一些类加载器也可能返回其他类型的资源,例如远程文件(在 URLClassLoader 的情况下)。

即使在 JAR 文件的情况下,实现也有可能以任何方式在 JAR 文件中维护您正在访问的文件的压缩字节的持久 View 。也许它持有一个内存映射的 ByteBuffer...

为什么要冒险?您应该始终关闭流(以及任何其他 Closeable,实际上),无论它们是如何提供给您的。

请注意,从 Java 7 开始,处理关闭 any 资源的首选方法肯定是 try-with-resources 构造。它正确地处理了几个在手写代码中很难管理的极端情况,但它对您来说几乎就像您忘记关闭资源一样容易编写。例如,您可以使用如下代码:

    try (InputStream in = Class.getResourceAsStream("someresource.txt")) {
        // Use the stream as you need to...
    }

    // Then forget about it... and yet, it has been closed properly.

至于检测泄漏,最好的策略是在VM关闭时获取内存转储,然后使用一些工具对其进行分析。两个流行的工具是 VisualVMEclipse mat .

关于java - Class.getResourceAsStream 应该关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19598088/

相关文章:

java - 对使用 getBean ("myService"的依赖项的类进行单元测试

java - 如何使用相对路径-Java

java - 将 Scala 数组与抽象类型结合使用

java - Android Syncronization - 表中已存在数据

java - 在开发模式中出现 Twig 加载错误,但在游戏中未出现

java - EJB 3 可以实现2 个远程接口(interface)吗?

c# - Java BouncyCaSTLe AES 解密的 C# 等价物是什么?

java - 解密由 Java HttpsURLConnection 生成的 Wireshark 中的客户端 SSL 流量

java - 如何使用selenium/java切换到新的弹出窗口

java - Lucene 内存不足