gpt4 book ai didi

java - 关闭对象中包含的InputStream

转载 作者:行者123 更新时间:2023-12-02 02:09:59 25 4
gpt4 key购买 nike

关闭属于对象一部分的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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com