关闭对象中包含的InputStream

时间:2018-05-03 13:48:43

标签: java io

关闭作为对象一部分的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块中。

1 个答案:

答案 0 :(得分:2)

我建议你自己在AutoCloseable中实施Uploadable,然后将其关闭给创作者/来电者。

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

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