12

在一个 Android 应用程序中,我正在发送从 中拍摄的图片,Camera Intent因此我需要将 a 转换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;
}

一切正常,真正的问题是ByteArrayOutputStreamjavadoc 和 Android 文档之间的文档差异。

Javadoc读取_

关闭 ByteArrayOutputStream 无效。

Android 文档内容如下:

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

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

4

3 回答 3

10

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

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

close()所以总的来说,当不再需要任何类型的流时调用它是好的(有时是至关重要的) ,但更重要的是,最好知道我们为什么要调用它。

于 2013-03-13T10:15:27.740 回答
3

这是 ByteArrayOutputStrem.close 的实现

public void close() throws IOException {
}

API 说关闭 ByteArrayOutputStream 没有效果

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

于 2013-03-13T10:00:32.913 回答
0

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

于 2013-03-13T10:03:20.597 回答