在Android应用程序中关闭ByteArrayOutputStream

时间:2013-03-13 09:56:11

标签: java 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;
}

一切都运行正常,真正的问题是javadoc与Android文档之间的ByteArrayOutputStream文档的差异。

Javadoc读取

  

关闭ByteArrayOutputStream无效。

Android doc读取:

  

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

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

3 个答案:

答案 0 :(得分:9)

ByteArrayOutputStream是基于内存的流(由用户在代码中管理和填充),因此当您在其上调用close()时无效。清理其内存占用的唯一方法是撤消对该对象的所有引用。届时,垃圾收集器将在未来的任何时间启动并完成其工作以清理此类对象。

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

因此,一般情况下,在不再需要任何类型的流时调用close()是好的(有时是至关重要的),但更重要的是,最好知道我们为什么要调用它。

答案 1 :(得分:3)

这是ByteArrayOutputStrem.close

的实现
public void close() throws IOException {
}

API说关闭ByteArrayOutputStream无效

所以省略close()是安全的,另一方面它没有坏处,JVM无论如何都会跳过对空方法的调用。它可用于避免警告资源未关闭

答案 2 :(得分:0)

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