繁体   English   中英

关闭对象中包含的InputStream

[英]Closing InputStream contained in an object

关闭作为对象一部分的InputStream的正确方法是什么?

class Uploadable {
    InputStream is;
    ...
}

该对象传递给上载方法:

uploadMethod(Uploadable up);

创建Uploadable的方式是:

  • 来自ServletPart对象。 有一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM