12

Android アプリケーションでは、から撮った写真を送信しているので、a をバイト配列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;
}

すべてが正常に動作し、実際の問題は、ByteArrayOutputStreamjavadoc と Android のドキュメントのドキュメントの違いです。

Javadocの読み取り

ByteArrayOutputStream を閉じても効果はありません。

Androidのドキュメントには次のように書かれています:

このストリームを閉じます。これにより、このストリームに使用されているシステム リソースが解放されます。

何があってもストリームを閉じますが、どのドキュメントが正しいのか、なぜ異なるのかを知りたいです。

4

3 に答える 3

10

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

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

close()したがって、一般に、必要がなくなったときに任意のタイプのストリームを呼び出すことは良いことです (場合によっては不可欠です) 。

于 2013-03-13T10:15:27.740 に答える
3

これは ByteArrayOutputStrem.close の実装です

public void close() throws IOException {
}

API は、ByteArrayOutputStream を閉じても効果がないことを示しています

そのため、close() を省略しても安全ですが、JVM は空のメソッドへの呼び出しをスキップします。resource is not closed という警告を回避するために使用できます。

于 2013-03-13T10:00:32.913 に答える