问题 在Android应用程序中关闭ByteArrayOutputStream


在Android应用程序中,我正在发送一张照片 Camera 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;
}

一切都很好,所有,真正的问题是文档的差异 ByteArrayOutputStream 来自Android的javadoc和doc之间。

的Javadoc 读

关闭ByteArrayOutputStream无效。

Android doc 内容如下:

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

我关闭流不管是什么,但我想知道哪些文档是正确的以及为什么它们是不同的。


3961
2018-03-13 09:56


起源

第一个和第二个是正确的,取决于outputstrem实现,关闭一个baos,什么都不做。然而,不管它们来自何处,总是关闭溪流是一种好习惯 - epoch
您是否担心字节数组中的流发生了什么? close 叫做? - Perception
@epoch但问题是: 为什么在它什么都不做的时候需要关闭这个流? - waqaslam
@Perception我不认为底层字节数组发生的问题是问题,因为流对象将在范围之外被GC。 - bvidal
@bvidal - 所以你的问题只是好奇心呢?无论如何,第一份文件是正确的, close BAOS上的操作是无操作的。正如已经说明的那样,你现在正在做,你应该关闭它。 - Perception


答案:


ByteArrayOutputStream 是一个基于内存的流(由用户在代码中管理和填充),因此在您调用时没有任何效果 close() 在上面。清理其内存占用空间的唯一方法是撤消对该对象的所有引用。到那时, 垃圾收集器 将来很快就会开始工作并完成清理这些物品的工作。

但是,当您使用文件或输入/输出套接字流等资源时,需要关闭流(例如, OutputStreamInputStream)。你打电话时 close() 在这些流上,JVM安全地释放其本地存储/占用内存并避免任何OutOfMemory问题。

所以一般来说,打电话很好(有时候也很重要) close() 在不再需要的任何类型的流上,但更重要的是,最好知道我们为什么要打电话。


8
2018-03-13 10:15





这是ByteArrayOutputStrem.close的实现

public void close() throws IOException {
}

API说 关闭ByteArrayOutputStream无效

因此,省略close()是安全的,另一方面它不会造成伤害,JVM无论如何都会跳过对空方法的调用。它可能用于避免警告 资源没有关闭


3
2018-03-13 10:00





关闭流不会造成任何伤害,但不会关闭它。 所以最好关闭它。


0
2018-03-13 10:03