java - 关闭对象中包含的InputStream

标签 java io

关闭属于对象一部分的InputStream的正确方法是什么?

class Uploadable {
    InputStream is;
    ...
}

该对象被传递给上传方法:

uploadMethod(Uploadable up);

创建可上传的方式是:

  • 来自 Servlet 中的 Part 对象。有一个 part.getInputStream() 返回一个 InputStream
  • 来自 byte[],由某些 Web 服务传递。 InputStream 可以通过new ByteArrayInputStream 获得。

问题是,一旦 InputStream 位于对象中,就失去了很好地关闭它的能力,因为该对象是在一个地方创建的,但在其他地方使用。这限制了我使用 try-with-resources 的能力,因为该对象可能不会在 try block 的上下文中使用。我看到的唯一方法是使 is 不可变,并创建一个特定的 Uploadable.close() 方法,该方法在使用完成时关闭 InputStream 。或者,我可以存储 byte[] 而不是 InputStream 并将 part.getInputStream() 转换为字节数组。然而,这对我来说似乎是一个糟糕的性能决定,因为我将得到一个 InputStream,将其转换为 byte[],然后再次转换为 InputStream code> 在上传方法中。

我认为这是一个众所周知的问题,但我找不到最佳实践。甲骨文始终closes the object在 try-with-resources block 或 finally block 中。

最佳答案

我建议您在 Uploadable 中自行实现 AutoCloseable 并将其关闭留给创建者/调用者。

class Uploadable implements AutoCloseable {
    InputStream is;
    public void close() throws IOException {
        if (is != null) {
            is.close();
        }
    }
}

这样,如果需要的话,可以在 try-with-resource block 中创建 Uploadable - 在这种情况下,关闭它的责任将留给客户端代码。

关于java - 关闭对象中包含的InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156674/

相关文章:

java - Cobertura,压制线永远不应该出现

Java:没有接口(interface)实现?

C: fscanf 导致未初始化变量错误

haskell - getArgs 如何工作?

java - 使用静态方法执行文件 I/O 时出现 NotSerializableException

java - 无法使用 Files.walkFileTree java nio 打印目录内的子目录

java - Java 中打开的文件太多

java - 在 Java 中创建 keystore 文件 (.jks) 和自签名证书 (.cer/.crt)

java - 字段authenticationManager LoginController需要一个类型为AuthenticationManager'的bean,但无法找到

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?