在Android应用程序中关闭ByteArrayOutputStream

bvi*_*dal 12 java android bytearrayoutputstream

在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;
}
Run Code Online (Sandbox Code Playgroud)

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

Javadoc中读取

关闭ByteArrayOutputStream无效.

Android的文档读取:

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

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

waq*_*lam 9

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

然而,当你从事资源,如文件或输入/输出插孔流闭流是必需的(例如OutputStream,InputStream).当您调用close()此类流时,JVM会安全地释放其本地存储/占用内存,并避免任何OutOfMemory问题.

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