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

最初と2番目は正しいです、outputstremの実装に依存し、baosを閉じる、何もしません。しかし、どこから来ても常にストリームを閉じるのが良い方法です。 – epoch

+0

'close'が呼び出されたとき、バイト配列の基礎となるストリームに何が起こるか心配していますか? – Perception

+0

@epochただし、問題は次のとおりです。**何もしないときにこのストリームを閉じる必要があるのはなぜですか?** – waqaslam

答えて

8

ByteArrayOutputStreamはメモリベースのストリームです(コードで管理され、ユーザーが入力します)。close()を呼び出すと効果はありません。メモリのフットプリントをクリーンアップする唯一の方法は、このオブジェクトへのすべての参照を取り消すことです。それまでには、ガベージコレクタはいつでもすぐに起動し、そのようなオブジェクトをクリーンアップする仕事をします。

ただし、ファイルや入出力ソケットストリームなどのリソースを使用する場合は、ストリームを閉じる必要があります(OutputStreamInputStreamなど)。このようなストリームでclose()を呼び出すと、JVMはローカルストレージ/占有メモリを安全に解放し、OutOfMemoryの問題を回避します。

一般的に、それはもはや必要でなくなったときに、どんなタイプのストリームでもclose()を呼び出すのは良い(そして時には重要です)が、もっと重要なのは、なぜ呼び出すべきかを知ることです。

3

これは、一方で、それは害はありませんByteArrayOutputStrem.close

public void close() throws IOException { 
} 

APIはByteArrayOutputStreamを閉じは効果

を持っていないので、それは(近くに省略しても安全だと言う)の実装ですJVMはとにかく空のメソッドへの呼び出しをスキップします。 リソースが閉じていない

0

ストリームを閉じることは害はありませんが、それを閉じることはできません。 それを閉じる方が良いです。

関連する問題