【问题标题】:Closing ByteArrayOutputStream in an Android application在 Android 应用程序中关闭 ByteArrayOutputStream
【发布时间】:2013-03-13 09:56:10
【问题描述】:

在一个 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 的文档在 javadoc 和 Android 文档之间的区别。

Javadoc 读取

关闭 ByteArrayOutputStream 无效。

Android doc 写着:

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

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

【问题讨论】:

  • 第一个和第二个是正确的,取决于 outputstrem 的实现,关闭一个 baos,什么都不做。但是,无论流来自何处,始终关闭流是一种好习惯
  • close 被调用时,您是否担心底层字节数组的流会发生什么?
  • @epoch 但问题是:为什么它什么都不做时需要关闭这个流?
  • @Perception 我认为底层字节数组发生的事情不是问题,因为一旦超出范围,流对象就会被 GC。
  • @bvidal - 那么你的问题只是单纯的好奇?无论如何,第一个文档是正确的,BAOS 上的close 操作是无操作的。如前所述,您目前正在这样做,无论如何都应该关闭它。

标签: java android bytearrayoutputstream


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这是ByteArrayOutputStrem.close的实现

    public void close() throws IOException {
    }
    

    API 说 关闭 ByteArrayOutputStream 无效

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-10-15
        • 2023-03-19
        • 2013-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多