2013-03-13 151 views
11

在Android应用程序中,我发送了一张来自Camera Intent的图片,因此我需要将Bitmap转换为一个字节数组。要做到这一点我使用ByteArrayOutputStream如下:在Android应用程序中关闭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写着:

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

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

+2

第一个和第二个都是正确的,取决于outputstrem的实现,关闭一个baos,什么都不做。但是总是关闭流是一个很好的习惯,不管他们来自哪里 – epoch 2013-03-13 09:58:52

+0

你是否担心在调用close函数时,字节数组之间会发生什么? – Perception 2013-03-13 10:02:33

+0

@epoch,但问题是:**为什么当它什么都不做时需要关闭这个流?** – waqaslam 2013-03-13 10:05:49

回答

8

ByteArrayOutputStream是一个基于内存的流(由用户在代码中管理和填充),因此当您调用close()时不起作用。清理内存足迹的唯一方法是撤销对该对象的所有引用。届时,垃圾收集器将在未来的任何时间快速启动并完成其清理这些对象的工作。

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

因此,一般来说,当不再需要任何类型的数据流时,呼叫close()是好的(有时甚至是至关重要的),但更重要的是,最好知道我们为什么要打电话。

3

这是ByteArrayOutputStrem.close

实施
public void close() throws IOException { 
} 

API说关闭一个ByteArrayOutputStream没有效果

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

0

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