在Android应用程序中关闭ByteArrayOutputStream

12
在一个安卓应用中,我正在发送从相机Intent拍摄的图片,所以我需要将Bitmap转换为字节数组。为此,我使用如下的ByteArrayOutputStream:
private byte[] getRawImageData(Bitmap source) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] rawImageData = null;
    try {
        source.compress(CompressFormat.JPEG, DEFAULT_COMRESSION, baos);
        rawImageData = baos.toByteArray();
    } finally {
        try {
            baos.close();
        } catch (IOException e) {
            // handle exception here
        }
    }
    return rawImageData;
}

一切都正常工作,真正的问题是在Javadoc和Android文档中ByteArrayOutputStream之间的差异。

Javadoc读取:

关闭ByteArrayOutputStream没有任何效果。

Android文档读取:

关闭此流。这将释放用于此流的系统资源。

无论如何,我都会关闭流,但我想知道哪个文档是正确的,并且它们为什么不同。


2
第一和第二是正确的,这取决于OutputStrem实现,关闭BAOS不会有任何影响。然而,无论从哪里来,关闭流都是一个好习惯。 - epoch
当调用 close 方法时,您是否担心底层字节数组的流会发生什么? - Perception
@epoch 但问题是:为什么需要关闭这个流,当它根本没有做任何事情? - waqaslam
@Perception 我认为底层字节数组发生的事情并不是问题,因为一旦流对象超出范围,它就会被垃圾回收。 - El Bert
1
@bvidal - 那么你的问题只是纯粹的好奇心吗?无论如何,第一个文档是正确的,对于BAOS的“close”操作是一个空操作。正如已经提到的并且您目前正在做的那样,您应该关闭它。 - Perception
3个回答

10

ByteArrayOutputStream是一种基于内存的流(由用户在代码中管理和填充),因此当您调用close()时不会产生影响。清除其内存占用的唯一方法是撤销对此对象的所有引用。随后,垃圾回收器将会很快地自动运行并清理这些对象。

然而,当您使用像文件或输入/输出套接字流(如OutputStreamInputStream)等资源时,关闭流是必需的。当您在这些流上调用close()时,JVM会安全地释放它们的本地存储/占用内存,并避免任何OutOfMemory问题。

因此,一般来说,在不再需要任何类型的流时调用close()是好的(有时是至关重要的),但更重要的是要知道为什么应该这样做。


3
这是ByteArrayOutputStream.close的实现。
public void close() throws IOException {
}

API表示 关闭 ByteArrayOutputStream 没有任何影响

因此,省略 close() 是安全的。另一方面, JVM 会跳过对空方法的调用,因此也不会产生负面影响。它可用于避免警告 资源未关闭


0
关闭流不会造成任何损害,但不关闭它可能会有问题。因此最好还是关闭它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接