[英]Closing InputStream contained in an object
关闭作为对象一部分的InputStream
的正确方法是什么?
class Uploadable {
InputStream is;
...
}
该对象传递给上载方法:
uploadMethod(Uploadable up);
创建Uploadable的方式是:
Servlet
的Part
对象。 有一个part.getInputStream()
返回InputStream
。 byte[]
,由某些Web服务传递。 可以使用new ByteArrayInputStream
获得InputStream
。 问题是一旦InputStream
进入对象,就无法很好地关闭它,因为对象是在一个地方创建的,而在其他地方使用的。 这限制了我使用try-with-resources的能力,因为该对象可能不会在try
块的上下文中使用。 我看到的唯一方法是使它is
不可变的,并创建一个特定的Uploadable.close()
方法,该方法将在使用完成时关闭InputStream
。 另外,我可以存储一个byte[]
而不是InputStream
并将part.getInputStream()
转换为字节数组。 但是,对我来说,这似乎是一个糟糕的性能决定,因为我将得到一个InputStream
,将其转换为byte[]
,然后在上载方法中再次将其转换为InputStream
。
我想这是一个众所周知的问题,但是我找不到最佳实践。 Oracle总是在try-with-resources块或finally
块中关闭对象 。
我建议您在Uploadable
自己实现AutoCloseable
,然后将其关闭给创建者/调用者。
class Uploadable implements AutoCloseable {
InputStream is;
public void close() throws IOException {
if (is != null) {
is.close();
}
}
}
这样,如果需要,可以在try-with-resource块中创建Uploadable
,在这种情况下,关闭它的责任留给客户端代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.