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