2013-03-13 154 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

關閉流不會造成任何傷害,但不會關閉它。 所以最好關閉它。