关闭作为对象一部分的InputStream
的正确方法是什么?
class Uploadable {
InputStream is;
...
}
将此对象传递给上传方法:
uploadMethod(Uploadable up);
创建可上传的方法是:
Part
中的Servlet
对象。有一个part.getInputStream()
会返回InputStream
。byte[]
,由某些Web服务传递。可以使用InputStream
new ByteArrayInputStream
问题是一旦InputStream
在对象中,很好地关闭它的能力有点丢失,因为对象是在一个地方创建的,但在其他地方使用。这限制了我使用try-with-resources的能力,因为该对象可能不会在try
块的上下文中使用。我看到的唯一方法是使is
不可变,并创建一个特定的Uploadable.close()
方法,只要用完就关闭InputStream
。或者,我可以存储byte[]
而不是InputStream
,并将part.getInputStream()
转换为字节数组。但是,对我来说,这似乎是一个糟糕的性能决定,因为我会得到InputStream
,将其转换为byte[]
,然后在上传方法中再次转换为InputStream
。
我认为这是一个众所周知的问题,但我无法找到最佳实践。 Oracle始终closes the object在try-with-resources块或finally
块中。
答案 0 :(得分:2)
我建议你自己在AutoCloseable
中实施Uploadable
,然后将其关闭给创作者/来电者。
class Uploadable implements AutoCloseable {
InputStream is;
public void close() throws IOException {
if (is != null) {
is.close();
}
}
}
这样,如果需要,可以在try-with-resource块中创建Uploadable
- 在这种情况下,关闭它的责任留给客户端代码。